K vrácení posledního dne daného měsíce můžeme v PostgreSQL použít následující techniku.
Může to být poslední den aktuálního měsíce nebo poslední den v měsíci na základě data, které určíme.
Konec aktuálního měsíce
Zde je příklad, který vrací poslední den aktuálního měsíce:
SELECT (date_trunc('month', now()) + interval '1 month - 1 day');
Výsledek:
2022-04-30 00:00:00+10
Toto používá PostgreSQL date_trunc()
funkce, spolu s nějakou aritmetikou data, abychom vrátili výsledky, které chceme. Tato funkce zkrátí hodnotu data/času na zadanou přesnost.
V tomto případě používám now()
funkce vrátí aktuální datum a 'month'
argument upraví toto datum na začátek měsíce. Potom jsem k tomu přidal jeden měsíc (čímž se přesune na začátek následujícího měsíce), poté jsem od tohoto data odečetl jeden den, abychom dostali konec předchozího měsíce (což je konec aktuálního měsíce).
V případě potřeby jej můžeme přetypovat na hodnotu data:
SELECT (date_trunc('month', now()) + interval '1 month - 1 day')::date;
Výsledek:
2022-04-30
Tady je to znovu, spolu se skutečným datem, kdy jsem spustil příklad:
SELECT
now()::date AS "Current Date",
(date_trunc('month', now()) + interval '1 month - 1 day')::date AS "End of Month";
Výsledek:
+--------------+--------------+ | Current Date | End of Month | +--------------+--------------+ | 2022-04-09 | 2022-04-30 | +--------------+--------------+
Konec určeného měsíce
Nemusí to být konec aktuálního měsíce. Můžeme zadat libovolné datum a vrátí se konec měsíce na základě tohoto data.
Příklad:
SELECT (date_trunc('month', date '2030-07-14') + interval '1 month - 1 day')::date;
Výsledek:
2030-07-31
Příklad databáze
Zde je příklad, který používá data z databáze:
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;
Výsledek:
+---------------------+--------------+ | 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 | +---------------------+--------------+