Logo

Firebird: Linguagem PSQL

Otimização e centralização de regras de negócio com Procedural SQL.

Pegando o primeiro dia do mês de uma determinada data

Vez ou outra em PSQL precisamos de uma função que retorne o primeiro e o último dia do mês de uma determinada data. Isso parece simples, afinal sabemos que o início do mês será sempre o dia '01', muito diferente do último dia do mês que pode variar conforme o mês e o ano. Na função abaixo criamos uma função que retornará o primeiro dia do mês de uma determinada data e retorne em formato do tipo timestamp. Essa função trabalhará em conjunto com a função também explicada em outro artigo chamada de GET_LAST_DAY_OF_MONTH.

Se já teve uma necessidade assim, a função PSQL abaixo irá resolver seu problema:

CREATE OR ALTER FUNCTION GET_FIRST_DAY_OF_MONTH (
    P_DATE_REF TIMESTAMP)
RETURNS TIMESTAMP
AS
DECLARE VARIABLE LCALC_DATE TIMESTAMP;
BEGIN
  -- Calcula o início do mês da data informada
  LCALC_DATE=:P_DATE_REF;
  SELECT CAST(:P_DATE_REF AS DATE) - EXTRACT(DAY FROM CAST(:P_DATE_REF AS DATE)) + 1
  FROM RDB$DATABASE
  INTO :LCALC_DATE;

  RETURN :LCALC_DATE;
END

Modo de usar

SELECT
  GET_FIRST_DAY_OF_MONTH(CURRENT_TIMESTAMP) AS PRIMEIRO_DIA_DO_MES 
FROM RDB$DATABASE

Imagine pesquisar um período de fechamento do mês atual:

SELECT * FROM TABELA A
WHERE 
  A.DT_LANCAMENTO BETWEEN 
    GET_FIRST_DAY_OF_MONTH(CURRENT_TIMESTAMP)
      AND 
    GET_LAST_DAY_OF_MONTH(CURRENT_TIMESTAMP)

Conclusão

Funções para pegar o início e o fim do mês podem parecer bobagem no início, mas confie em mim: programando com PSQL você terá momentos em que precisará dessas datas para processar algo importante que deva ser contado a partir do início do mês, até o término dele ou ambos. Por exemplo, considere a possibilidade de consultar lançamentos de um período mensal, onde irá do dia 01 até o final do mês incluindo o sufixo de hora 23:59:59 para não perder os movimentos do último dia. O fato da função retornar um timestamp vai te ajudar inclusive com o índice que não precisará de um cast de timestamp para date.

← Voltar para PSQL