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".
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.
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);