Podemos usar la siguiente técnica en PostgreSQL para devolver el último día de un mes determinado.
Este podría ser el último día del mes actual o el último día del mes según una fecha que especifiquemos.
Fin del mes actual
Aquí hay un ejemplo que devuelve el último día del mes actual:
SELECT (date_trunc('month', now()) + interval '1 month - 1 day');
Resultado:
2022-04-30 00:00:00+10
Esto usa date_trunc()
de PostgreSQL función, junto con alguna aritmética de fecha para devolver los resultados que queremos. Esta función trunca un valor de fecha/hora con una precisión especificada.
En este caso uso el now()
función para devolver la fecha actual y el 'month'
El argumento modifica esa fecha al comienzo del mes. Luego agregué un mes a eso (lo que lo lleva al comienzo del mes siguiente), luego resté un día de esa fecha para darnos el final del mes anterior (que es el final del mes actual).
Podemos convertirlo en un valor de fecha si es necesario:
SELECT (date_trunc('month', now()) + interval '1 month - 1 day')::date;
Resultado:
2022-04-30
Aquí está de nuevo, junto con la fecha real en la que ejecuté el ejemplo:
SELECT
now()::date AS "Current Date",
(date_trunc('month', now()) + interval '1 month - 1 day')::date AS "End of Month";
Resultado:
+--------------+--------------+ | Current Date | End of Month | +--------------+--------------+ | 2022-04-09 | 2022-04-30 | +--------------+--------------+
Final de un mes especificado
No tiene que ser el final del mes actual. Podemos especificar cualquier fecha y regresará al final del mes, según esa fecha.
Ejemplo:
SELECT (date_trunc('month', date '2030-07-14') + interval '1 month - 1 day')::date;
Resultado:
2030-07-31
Ejemplo de base de datos
Aquí hay un ejemplo que usa fechas de una base de datos:
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;
Resultado:
+---------------------+--------------+ | 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 | +---------------------+--------------+