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 inicio do mês será sempre será 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 inicio do mes da data informado 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)
Conclusion
Funções para pegar o inicio e o fim do mês podem parecer bobagem no inicio, 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 inicio 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 desde ultimo dia. O fato da função retornar um timestamp vai te ajudar inclusive com o indice que não precisará dum cast de timestamp para date.