¿Cómo determino el último día del mes anterior usando PostgreSQL?

Necesito consultar una database PostgreSQL para determinar los loggings que caen dentro de la date de hoy y el último día del mes anterior. En otras palabras, me gustaría recuperar todo lo que cae entre el 31 de diciembre de 2011 y hoy. Esta consulta se volverá a utilizar cada mes, por lo que el próximo mes, la consulta se basará en la date actual y el 31 de enero de 2012.

He visto esta opción , pero preferiría evitar el uso de una function (si es posible).

Ambas soluciones incluyen el último día del mes anterior y también incluyen todo el "hoy".

Para una columna de date :

 SELECT * FROM tbl WHERE my_date BETWEEN date_trunc('month', now())::date - 1 AND now()::date 

Puede restar valores integers simples de una date (pero no de una timestamp ) para restar días. Esta es la forma más simple y rápida.

Para una columna de timestamp :

 SELECT * FROM tbl WHERE my_timestamp >= date_trunc('month', now()) - interval '1 day' AND my_timestamp < date_trunc('day' , now()) + interval '1 day' 

Tenga en count que utilizo el operador < para la segunda condición para get resultados precisos (~ "antes de mañana").

No lancé hasta la date en la segunda consulta. En su lugar, agrego un interval '1 day' para evitar el lanzamiento de un lado a otro.

Eche un vistazo a los types y funciones de date / hora en el manual.

Prueba esto:

 SELECT ... WHERE date_field between (date_trunc('MONTH', now()) - INTERVAL '1 day')::date and now()::date ... 

Para get la date del mes anterior / último:

 SELECT (date_trunc('month', now())::date - 1) as last_month_date 

Resultado: 2012-11-30

Para get el número de días del mes anterior / último:

 SELECT DATE_PART('days', date_trunc('month', now())::date - 1) last_month_days 

Resultado: 30

Tratar

 select current_date - cast((date_part('day', current_date) + 1) as int) 

tomar de http://wiki.postgresql.org/wiki/Date_LastDay , y modificar para devolver solo los días en un mes

  CREATE OR REPLACE FUNCTION calc_days_in_month(date) RETURNS double precision AS $$ SELECT EXTRACT(DAY FROM (date_trunc('MONTH', $1) + INTERVAL '1 MONTH - 1 day')::date); $$ LANGUAGE 'sql' IMMUTABLE STRICT; select calc_days_in_month('1999-05-01') 

devuelve 31

La reference se toma de este blog:

Puede usar la function siguiente:

 CREATE OR REPLACE FUNCTION fn_GetLastDayOfMonth(DATE) RETURNS DATE AS $$ SELECT (date_trunc('MONTH', $1) + INTERVAL '1 MONTH - 1 day')::DATE; $$ LANGUAGE 'sql' IMMUTABLE STRICT; 

Ejemplos de ejecuciones:

 SELECT *FROM fn_GetLastDayOfMonth(NOW()::DATE);