Come posso determinare l’ultimo giorno del mese precedente usando PostgreSQL?

Devo interrogare un database PostgreSQL per determinare i record che rientrano nella data odierna e nell’ultimo giorno del mese precedente. In altre parole, mi piacerebbe recuperare tutto ciò che cade tra il 31 dicembre 2011 e oggi. Questa query verrà riutilizzata ogni mese, quindi il mese prossimo, la query sarà basata sulla data corrente e il 31 gennaio 2012.

Ho visto questa opzione , ma preferirei evitare l’uso di una funzione (se ansible).

Entrambe le soluzioni includono l’ultimo giorno del mese precedente e includono anche tutte le “oggi”.

Per una colonna della date :

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

È ansible sottrarre valori interi semplici da una date (ma non da un timestamp ) per sottrarre giorni. Questo è il modo più semplice e veloce.

Per una colonna timestamp :

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

Nota che uso l'operatore < per la seconda condizione per ottenere risultati precisi (~ "prima di domani").

Non scrivo fino ad date nella seconda query. Invece aggiungo un interval '1 day' , per evitare di andare avanti e indietro.

Dai un'occhiata ai tipi di data / ora e alle funzioni nel manuale.

Per ottenere la data del precedente / ultimo mese:

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

Risultato: 2012-11-30

Per ottenere il numero di giorni del precedente / ultimo mese:

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

Risultato: 30

Prova questo:

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

Provare

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

prendi da http://wiki.postgresql.org/wiki/Date_LastDay e modifica per restituire solo i giorni in un mese

  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') 

restituisce 31

Il riferimento è tratto da questo blog:

Puoi usare la funzione qui sotto:

 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; 

Esecuzioni di esempio:

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