Możemy użyć następującej techniki w PostgreSQL, aby zwrócić ostatni dzień danego miesiąca.
Może to być ostatni dzień bieżącego miesiąca lub ostatni dzień miesiąca na podstawie określonej przez nas daty.
Koniec bieżącego miesiąca
Oto przykład, który zwraca ostatni dzień bieżącego miesiąca:
SELECT (date_trunc('month', now()) + interval '1 month - 1 day');
Wynik:
2022-04-30 00:00:00+10
To używa date_trunc()
PostgreSQLa funkcja, wraz z arytmetykami dat, aby zwrócić żądane wyniki. Ta funkcja obcina wartość daty/godziny do określonej precyzji.
W tym przypadku używam now()
funkcja zwracająca bieżącą datę i 'month'
argument modyfikuje tę datę na początek miesiąca. Następnie dodałem do tego jeden miesiąc (co oznacza początek następnego miesiąca), a następnie odjąłem jeden dzień od tej daty, aby dać nam koniec poprzedniego miesiąca (czyli koniec bieżącego miesiąca).
W razie potrzeby możemy rzutować go na wartość daty:
SELECT (date_trunc('month', now()) + interval '1 month - 1 day')::date;
Wynik:
2022-04-30
Oto znowu, wraz z faktyczną datą uruchomienia przykładu:
SELECT
now()::date AS "Current Date",
(date_trunc('month', now()) + interval '1 month - 1 day')::date AS "End of Month";
Wynik:
+--------------+--------------+ | Current Date | End of Month | +--------------+--------------+ | 2022-04-09 | 2022-04-30 | +--------------+--------------+
Koniec określonego miesiąca
Nie musi to być koniec bieżącego miesiąca. Możemy określić dowolną datę, a zwróci koniec miesiąca na podstawie tej daty.
Przykład:
SELECT (date_trunc('month', date '2030-07-14') + interval '1 month - 1 day')::date;
Wynik:
2030-07-31
Przykład bazy danych
Oto przykład wykorzystujący daty z bazy danych:
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;
Wynik:
+---------------------+--------------+ | 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 | +---------------------+--------------+