Podemos usar a seguinte técnica no PostgreSQL para retornar o último dia de um determinado mês.
Este pode ser o último dia do mês atual ou o último dia do mês com base em uma data que especificamos.
Fim do mês atual
Aqui está um exemplo que retorna o último dia do mês atual:
SELECT (date_trunc('month', now()) + interval '1 month - 1 day');
Resultado:
2022-04-30 00:00:00+10
Isso usa o
date_trunc()
do PostgreSQL função, juntamente com alguma aritmética de data para retornar os resultados que queremos. Esta função trunca um valor de data/hora para uma precisão especificada. Neste caso eu uso o
now()
função para retornar a data atual e o 'month'
argumento modifica essa data para o início do mês. Em seguida, adicionei um mês a isso (o que o leva ao início do mês seguinte) e subtraí um dia dessa data para nos dar o final do mês anterior (que é o final do mês atual). Podemos convertê-lo em um valor de data, se necessário:
SELECT (date_trunc('month', now()) + interval '1 month - 1 day')::date;
Resultado:
2022-04-30
Aqui está novamente, junto com a data real em que executei o exemplo:
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 | +--------------+--------------+
Fim de um mês especificado
Não precisa ser o final do mês atual. Podemos especificar qualquer data e retornará o final do mês, com base nessa data.
Exemplo:
SELECT (date_trunc('month', date '2030-07-14') + interval '1 month - 1 day')::date;
Resultado:
2030-07-31
Exemplo de banco de dados
Aqui está um exemplo que usa datas de um banco de dados:
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 | +---------------------+--------------+