2011-08-03 20 views
16

Estoy tratando de obtener lo siguiente en plpgsql:Cómo obtener el número de días en un mes en PostgreSQL

select day_in_month(2); 

Resultados previstos

28 

¿Hay alguna construida en que me falta en postgres para hacer eso?

+2

Con respecto a su ejemplo, ¿ha oído hablar de años bisiestos (o hay una suposición implícita de que esto es para el * año * actual)? – NPE

Respuesta

27
SELECT 
    DATE_PART('days', 
     DATE_TRUNC('month', NOW()) 
     + '1 MONTH'::INTERVAL 
     - '1 DAY'::INTERVAL 
    ) 

Sustituya NOW() con cualquier otra fecha.

+10

Reemplazaría el segundo 'DATE_TRUNC ('month', NOW())' con ''1 day' :: interval' – sayap

+2

@ la corrección de sayap es crucial; la solución puede dar lugar a malos resultados (intente, por ejemplo, ''2006-04-30' :: date') en lugar de' NOW() ' –

1

Tenga en cuenta que la salida esperada para day_in_month (2) puede ser 29 debido a los años bisiestos. Es posible que desee pasar una fecha en lugar de una int.

Además, tenga cuidado de horario de verano: eliminar la zona horaria o de lo contrario algunos cálculos monthes podrían estar equivocados (al lado de ejemplo, en CET/CEST):

SELECT DATE_TRUNC('month', '2016-03-12'::timestamptz) + '1 MONTH'::INTERVAL 
     - DATE_TRUNC('month', '2016-03-12'::timestamptz) ; 
------------------ 
30 days 23:00:00 

SELECT DATE_TRUNC('month', '2016-03-12'::timestamp) + '1 MONTH'::INTERVAL 
     - DATE_TRUNC('month', '2016-03-12'::timestamp) ; 
---------- 
31 days 
0

Esto funciona así.

WITH date_ AS (SELECT your_date AS d) 
SELECT d + INTERVAL '1 month' - d FROM date_; 

O simplemente:

SELECT your_date + INTERVAL '1 month' - your_date; 

Estos dos retorno intervalo, no número entero.

-1
SELECT cnt_dayofmonth(2016, 2); -- 29 


create or replace function cnt_dayofmonth(_year int, _month int) 
returns int2 as 
$BODY$ 
-- ZU 2017.09.15, returns the count of days in mounth, inputs are year and month 
declare 
    datetime_start date := ('01.01.'||_year::char(4))::date; 
    datetime_month date := ('01.'||_month||'.'||_year)::date; 
     cnt int2; 
begin 
    select extract(day from (select (datetime_month + INTERVAL '1 month -1 day'))) into cnt; 

    return cnt; 
end; 
$BODY$ 
language plpgsql; 
+0

. Las respuestas con solo el código no se recomiendan ya que no brindan mucha información para lectores futuros. proporciona alguna explicación a lo que has escrito – WhatsThePoint

Cuestiones relacionadas