Vi kan bruge følgende teknik i PostgreSQL til at returnere den sidste dag i en given måned.
Dette kan være den sidste dag i den aktuelle måned eller den sidste dag i måneden baseret på en dato, som vi angiver.
Udgangen af den aktuelle måned
Her er et eksempel, der returnerer den sidste dag i den aktuelle måned:
SELECT (date_trunc('month', now()) + interval '1 month - 1 day');
Resultat:
2022-04-30 00:00:00+10
Dette bruger PostgreSQL's date_trunc()
funktion, sammen med noget dato-aritmetik for at returnere de resultater, vi ønsker. Denne funktion afkorter en dato/tidsværdi med en specificeret præcision.
I dette tilfælde bruger jeg now()
funktion for at returnere den aktuelle dato og 'month'
argument ændrer denne dato til begyndelsen af måneden. Jeg tilføjede derefter en måned til det (hvilket bringer det til starten af den følgende måned), og trak derefter en dag fra den dato for at give os slutningen af den foregående måned (som er slutningen af den nuværende måned).
Vi kan caste det til en datoværdi, hvis det kræves:
SELECT (date_trunc('month', now()) + interval '1 month - 1 day')::date;
Resultat:
2022-04-30
Her er det igen, sammen med den faktiske dato, hvor jeg kørte eksemplet:
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 | +--------------+--------------+
Udgangen af en specificeret måned
Det behøver ikke at være slutningen af den aktuelle måned. Vi kan angive en hvilken som helst dato, og den returnerer slutningen af måneden, baseret på den dato.
Eksempel:
SELECT (date_trunc('month', date '2030-07-14') + interval '1 month - 1 day')::date;
Resultat:
2030-07-31
Databaseeksempel
Her er et eksempel, der bruger datoer fra en 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;
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 | +---------------------+--------------+