Сколько недель в каждом месяце 2015 и 2016 годов в соответствии со стандартом ISO?

В этом году 2014 имеет:

Jan-4
Feb-4
Mar-5
Apr-4
May-4
Jun-5
Jul-4
Aug-4
Sep-5
Oct-4
Nov-4
Dec-5

Как рассчитать это для любого данного года?

2 ответа

Есть несколько способов точно определить "недели в месяце". Предполагая, что ваш счет определен (как показывают ваши цифры):

Сколько понедельников лежит в каждом месяце года?

Вы можете сгенерировать это так:

Просто:

SELECT EXTRACT(month FROM d) AS mon, COUNT(*) AS weeks
FROM   generate_series('2014-01-01'::date
                     , '2014-12-31'::date
                     , interval '1 day') d
WHERE  EXTRACT(isodow FROM d) = 1  -- only Mondays
GROUP  BY 1
ORDER  BY 1;

Быстро:

SELECT EXTRACT(month FROM d) AS mon, COUNT(*) AS weeks
FROM   generate_series ('2014-01-01'::date  -- offset to first Monday
                      + (8 - EXTRACT(isodow FROM '2014-01-01'::date)::int)%7 
                      , '2014-12-31'::date
                      , interval '7 days') d
GROUP  BY 1
ORDER  BY 1;

В любом случае вы получите:

mon  weeks
1    4
2    4
3    5
4    4
5    4
6    5
7    4
8    4
9    5
10   4
11   4
12   5

Просто замени 2014 с годом интереса в каждом запросе.

Применение ISO 8601 к месяцу, как предлагается здесь

select
    to_char(d, 'YYYY Mon') as "Month",
    case when
        extract(dow from d) in (2,3,4)
        and
        extract(day from (d + interval '1 month')::date - 1) + extract(dow from d) >= 33
        then 5
        else 4
    end as weeks
from generate_series(
    '2014-01-01'::date, '2014-12-31', '1 month'
) g (d)
;
  Month   | weeks 
----------+-------
 2014 Jan |     5
 2014 Feb |     4
 2014 Mar |     4
 2014 Apr |     4
 2014 May |     5
 2014 Jun |     4
 2014 Jul |     5
 2014 Aug |     4
 2014 Sep |     4
 2014 Oct |     5
 2014 Nov |     4
 2014 Dec |     4
Другие вопросы по тегам