Ir para o conteúdo principal

Procedure - Retorna Meses Sequência

Estaremos compartilhando com vocês uma procedure que retorna de forma sequencial os meses, esta procedure permite definirmos se queremos meses abreviados ou não. Exemplo: Jan ou Janeiro, nos permite definir um numero de meses a retornar, e o numero de meses que serão exibidos:

create or alter procedure RETORNA_MESES_SEQUENCIA (
    ABREVIAR varchar(1) not null,
    RECUAR integer,
    NUMEROMESES integer not null)
returns (
    IDMES INTEGER,
    MES varchar(20),
    ANO integer)
as
declare variable COMPARAMES integer;
declare variable CONTADOR integer;
declare variable DATAINICIO date;
begin
  DATAINICIO = dateadd(RECUAR month to current_date);
  CONTADOR = 0;
  while (NUMEROMESES > 0) do
  begin
    COMPARAMES = extract(month from (dateadd(CONTADOR month to DATAINICIO)));
    ANO = extract(year from (dateadd(CONTADOR month to DATAINICIO)));
    IDMES = COMPARAMES;
    MES = case
            when COMPARAMES = 1 and ABREVIAR = 'S' then 'Jan'
            when COMPARAMES = 2 and ABREVIAR = 'S' then 'Fev'
            when COMPARAMES = 3 and ABREVIAR = 'S' then 'Mar'
            when COMPARAMES = 4 and ABREVIAR = 'S' then 'Abr'
            when COMPARAMES = 5 and ABREVIAR = 'S' then 'Mai'
            when COMPARAMES = 6 and ABREVIAR = 'S' then 'Jun'
            when COMPARAMES = 7 and ABREVIAR = 'S' then 'Jul'
            when COMPARAMES = 8 and ABREVIAR = 'S' then 'Ago'
            when COMPARAMES = 9 and ABREVIAR = 'S' then 'Set'
            when COMPARAMES = 10 and ABREVIAR = 'S' then 'Out'
            when COMPARAMES = 11 and ABREVIAR = 'S' then 'Nov'
            when COMPARAMES = 12 and ABREVIAR = 'S' then 'Dez'
            when COMPARAMES = 1 and ABREVIAR = 'N' then 'Janeiro'
            when COMPARAMES = 2 and ABREVIAR = 'N' then 'Fevereiro'
            when COMPARAMES = 3 and ABREVIAR = 'N' then 'Mar?o'
            when COMPARAMES = 4 and ABREVIAR = 'N' then 'Abril'
            when COMPARAMES = 5 and ABREVIAR = 'N' then 'Maio'
            when COMPARAMES = 6 and ABREVIAR = 'N' then 'Junho'
            when COMPARAMES = 7 and ABREVIAR = 'N' then 'Julho'
            when COMPARAMES = 8 and ABREVIAR = 'N' then 'Agosto'
            when COMPARAMES = 9 and ABREVIAR = 'N' then 'Setembro'
            when COMPARAMES = 10 and ABREVIAR = 'N' then 'Outubro'
            when COMPARAMES = 11 and ABREVIAR = 'N' then 'Novembro'
            when COMPARAMES = 12 and ABREVIAR = 'N' then 'Dezembro'
          end;
    CONTADOR = CONTADOR + 1;
    NUMEROMESES = NUMEROMESES - 1;
    suspend;
  end
end

CÓDIGO ATUALIZADO POR ARTUR SILVA EM 15/05/2020: Adicionado mais dois campos no retorno, IDMES e ANO.

Abaixo exemplo de uso/resultado:

SELECT MES 
  FROM RETORNA_MESES_SEQUENCIA ('N', -3, 6)

No exemplo acima, estou fazendo a chamada para não abreviar, voltar 3 meses e trazer um total de 6 meses, abaixo o resultado obtido: (Executado 19/02/2020)

Resultado:

---- Novembro
---- Dezembro
---- Janeiro
---- Fevereiro
---- Março
---- Abril

Exemplo de uso abreviado:

SELECT MES 
  FROM RETORNA_MESES_SEQUENCIA ('S', -3, 6)

No exemplo acima, estou fazendo a chamada para abreviar, voltar 3 meses e trazer um total de 6 meses, abaixo o resultado obtido: (Executado 19/02/2020)

Resultado:

---- Nov
---- Dez
---- Jan
---- Fev
---- Mar
---- Abr

Exemplo de uso sem voltar:

SELECT MES 
  FROM RETORNA_MESES_SEQUENCIA ('N', 0, 6)

No exemplo acima, estou fazendo a chamada para não abreviar, não voltar e não incrementar meses e trazer um total de 6 meses, abaixo o resultado obtido: (Executado 19/02/2020)

Resultado:

---- Fevereiro
---- Março
---- Abril
---- Maio
---- Junho
---- Julho

 Exemplo de uso com incremento de mês:

SELECT MES 
  FROM RETORNA_MESES_SEQUENCIA ('N', 2, 6)

No exemplo acima, estou fazendo a chamada para não abreviar, avançar 2 meses e trazer um total de 6 meses, abaixo o resultado obtido: (Executado 19/02/2020)

Resultado:

---- Abril
---- Maio
---- Junho
---- Julho
---- Agosto
---- Setembro

Exemplo de uso com incremento de mês:

SELECT IDMES,MES,ANO, IDMES || '/' || ANO AS MESANO 
  FROM RETORNA_MESES_SEQUENCIA ('S', -12, 13)
 ORDER BY ANO, IDMES;

No exemplo acima, estou fazendo a chamada para buscar os últimos 12 meses (a partir da data atual), conforme resultado abaixo: 

Resultado:

IDMES|MES      |ANO |MESANO |
-----|---------|----|-------|
    5|Mai      |2019|5/2019 |
    6|Jun      |2019|6/2019 |
    7|Jul      |2019|7/2019 |
    8|Ago      |2019|8/2019 |
    9|Set      |2019|9/2019 |
   10|Out      |2019|10/2019|
   11|Nov      |2019|11/2019|
   12|Dez      |2019|12/2019|
    1|Jan      |2020|1/2020 |
    2|Fev      |2020|2/2020 |
    3|Mar      |2020|3/2020 |
    4|Abr      |2020|4/2020 |
    5|Mai      |2020|5/2020 |