We kunnen de volgende techniek in PostgreSQL gebruiken om de laatste dag van een bepaalde maand te retourneren.
Dit kan de laatste dag van de huidige maand zijn, of de laatste dag van de maand op basis van een datum die we specificeren.
Einde van de huidige maand
Hier is een voorbeeld dat de laatste dag van de huidige maand retourneert:
SELECT (date_trunc('month', now()) + interval '1 month - 1 day');
Resultaat:
2022-04-30 00:00:00+10
Dit gebruikt PostgreSQL's date_trunc()
functie, samen met een rekenkundige datum om de gewenste resultaten te retourneren. Deze functie kapt een datum/tijd-waarde af tot een gespecificeerde precisie.
In dit geval gebruik ik de now()
functie om de huidige datum terug te geven, en de 'month'
argument wijzigt die datum naar het begin van de maand. Ik heb daar vervolgens een maand aan toegevoegd (wat het tot het begin van de volgende maand brengt), en vervolgens een dag van die datum afgetrokken om ons het einde van de vorige maand te geven (dat is het einde van de huidige maand).
We kunnen het indien nodig naar een datumwaarde casten:
SELECT (date_trunc('month', now()) + interval '1 month - 1 day')::date;
Resultaat:
2022-04-30
Hier is het weer, samen met de werkelijke datum waarop ik het voorbeeld heb uitgevoerd:
SELECT
now()::date AS "Current Date",
(date_trunc('month', now()) + interval '1 month - 1 day')::date AS "End of Month";
Resultaat:
+--------------+--------------+ | Current Date | End of Month | +--------------+--------------+ | 2022-04-09 | 2022-04-30 | +--------------+--------------+
Einde van een bepaalde maand
Het hoeft niet het einde van de huidige maand te zijn. We kunnen elke datum specificeren, en het zal het einde van de maand retourneren, gebaseerd op die datum.
Voorbeeld:
SELECT (date_trunc('month', date '2030-07-14') + interval '1 month - 1 day')::date;
Resultaat:
2030-07-31
Databasevoorbeeld
Hier is een voorbeeld dat datums uit een database gebruikt:
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;
Resultaat:
+---------------------+--------------+ | 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 | +---------------------+--------------+