Possiamo usare la seguente tecnica in PostgreSQL per restituire l'ultimo giorno di un determinato mese.
Potrebbe essere l'ultimo giorno del mese corrente o l'ultimo giorno del mese in base a una data da noi specificata.
Fine del mese in corso
Ecco un esempio che restituisce l'ultimo giorno del mese corrente:
SELECT (date_trunc('month', now()) + interval '1 month - 1 day');
Risultato:
2022-04-30 00:00:00+10
Questo utilizza date_trunc()
di PostgreSQL funzione, insieme ad alcune date aritmetiche per restituire i risultati desiderati. Questa funzione tronca un valore di data/ora con una precisione specificata.
In questo caso utilizzo now()
funzione per restituire la data corrente e il 'month'
argomento modifica tale data all'inizio del mese. Ho quindi aggiunto un mese a quello (che lo porta all'inizio del mese successivo), quindi ho sottratto un giorno da quella data per darci la fine del mese precedente (che è la fine del mese corrente).
Possiamo eseguirne il cast su un valore di data, se necessario:
SELECT (date_trunc('month', now()) + interval '1 month - 1 day')::date;
Risultato:
2022-04-30
Eccolo di nuovo, insieme alla data effettiva in cui ho eseguito l'esempio:
SELECT
now()::date AS "Current Date",
(date_trunc('month', now()) + interval '1 month - 1 day')::date AS "End of Month";
Risultato:
+--------------+--------------+ | Current Date | End of Month | +--------------+--------------+ | 2022-04-09 | 2022-04-30 | +--------------+--------------+
Fine di un mese specificato
Non deve essere per forza la fine del mese in corso. Possiamo specificare qualsiasi data e restituirà la fine del mese, in base a quella data.
Esempio:
SELECT (date_trunc('month', date '2030-07-14') + interval '1 month - 1 day')::date;
Risultato:
2030-07-31
Esempio di database
Ecco un esempio che utilizza le date di un database:
SELECT
rental_date,
(date_trunc('month', rental_date) + interval '1 month - 1 day')::date AS "End of Month"
FROM rental WHERE customer_id = 459 LIMIT 10;
Risultato:
+---------------------+--------------+ | rental_date | End of Month | +---------------------+--------------+ | 2005-05-24 22:54:33 | 2005-05-31 | | 2005-06-17 02:50:51 | 2005-06-30 | | 2005-06-17 09:38:22 | 2005-06-30 | | 2005-06-17 16:40:33 | 2005-06-30 | | 2005-06-20 02:39:21 | 2005-06-30 | | 2005-06-20 12:35:44 | 2005-06-30 | | 2005-06-20 12:42:00 | 2005-06-30 | | 2005-06-21 02:39:44 | 2005-06-30 | | 2005-07-06 00:22:29 | 2005-07-31 | | 2005-07-08 02:51:23 | 2005-07-31 | +---------------------+--------------+