Este año 2014 se ha:

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

Cómo calcular esto para cualquier año dado?

2 Comentarios

  1. 1

    Hay varias formas de definir las «semanas en un mes» exactamente. Suponiendo que su número se define (como sus números indican):

     Cómo muchos de lunes mentira en cada mes del año?

    Puede generar, como que:

    Simple:

    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;

    Rápido:

    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;

    De cualquier manera usted obtiene:

    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

    Basta con sustituir 2014 con el año de interés en cada consulta.

    • La norma ISO no está preocupado por el número de los lunes en un mes. (No estoy seguro si eso es lo que el OP está tratando de conseguir en.) El primer lunes de 2014 es en realidad 2013-12-30, tan lejos como ISO semanas de que se trate.
    • El primer lunes en el ISO año 2014 es 2013-12-30. El primer lunes del año Gregoriano (que es el significado común de «2014») es 2014-01-06. El «número de semanas en un mes» no está definido por la ISO – o por la pregunta. I ingeniería inversa de los más probable es que el significado de los números dados.
  2. 0

    La aplicación de la norma ISO 8601, un mes, como se sugiere aquí

    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

Dejar respuesta

Please enter your comment!
Please enter your name here