Vi kan använda följande teknik i PostgreSQL för att returnera den sista dagen i en given månad.
Detta kan vara den sista dagen i den aktuella månaden eller den sista dagen i månaden baserat på ett datum som vi anger.
Slutet av den aktuella månaden
Här är ett exempel som returnerar den sista dagen i innevarande månad:
SELECT (date_trunc('month', now()) + interval '1 month - 1 day');
Resultat:
2022-04-30 00:00:00+10
Detta använder PostgreSQL:s date_trunc()
funktion, tillsammans med lite datumaritmetik för att returnera de resultat vi vill ha. Den här funktionen trunkerar ett datum-/tidsvärde med en specificerad precision.
I det här fallet använder jag now()
funktion för att returnera det aktuella datumet och 'month'
argument ändrar det datumet till början av månaden. Jag lade sedan till en månad till det (vilket leder till början av följande månad) och subtraherade sedan en dag från det datumet för att ge oss slutet på föregående månad (vilket är slutet av innevarande månad).
Vi kan casta det till ett datumvärde om det behövs:
SELECT (date_trunc('month', now()) + interval '1 month - 1 day')::date;
Resultat:
2022-04-30
Här är det igen, tillsammans med det faktiska datumet då jag körde exemplet:
SELECT
now()::date AS "Current Date",
(date_trunc('month', now()) + interval '1 month - 1 day')::date AS "End of Month";
Resultat:
+--------------+--------------+ | Current Date | End of Month | +--------------+--------------+ | 2022-04-09 | 2022-04-30 | +--------------+--------------+
Slutet av en specificerad månad
Det behöver inte vara slutet av innevarande månad. Vi kan ange vilket datum som helst, och det återkommer i slutet av månaden, baserat på det datumet.
Exempel:
SELECT (date_trunc('month', date '2030-07-14') + interval '1 month - 1 day')::date;
Resultat:
2030-07-31
Databasexempel
Här är ett exempel som använder datum från en databas:
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;
Resultat:
+---------------------+--------------+ | 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 | +---------------------+--------------+