2014-09-04 3 views
0

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

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

возможно дубликат [PHP получить номер недели в течение месяца] (http://stackoverflow.com/questions/5853380/php-get-number -не недели за месяц) – Sal00m

+0

Почему бы просто не понять _руля_ для нумерации недель в году: http://en.wikipedia.org/wiki/ISO_week_date#Weeks_per_year –

+1

Ваш вопрос не имеет смысла. * Стандарт ISO не определяет какую-либо связь между неделями и месяцами. Дата либо выражается месяцем и днем ​​месяца, либо неделями и днями недели, ** никогда не смешивается **. * Http://en.wikipedia.org/wiki/ISO_week_date # Weeks_per_month – pozs

ответ

1

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

How many Mondays lie in each month of the year?

Вы можете создать его так:

Простой:

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 на год интереса к каждому запросу.

+0

Стандарт ИСО не касается количества понедельников в месяц. (Я не уверен, пытается ли это то, к чему стремится OP.) Первый понедельник в 2014 году - это действительно 2013-12-30, что касается недель ISO. –

+0

@Mike: Первый понедельник в * ISO * 2014 год - 2013-12-30. Первый понедельник в григорианский год (который является общим значением «2014») - 2014-01-06. «Число недель в месяц» не определяется ISO - или вопросом. Я переделал наиболее вероятное значение из заданных чисел. –

0

Применение ISO 8601 в месяц, как предложил here

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