Jump to content

Archived

This topic is now archived and is closed to further replies.

Motta

[Resolvido] Feriados Móveis

Recommended Posts

Precisei montar uma função para saber se determinado dia é feriado, sempre se tem o problema das festas móveis, achei uma função em outra linguagem que adaptei para PLSQL.

 

declare
 a number;
 b number;
 c number;
 d number;
 e number;
 f number;
 g number;
 h number;
 i number;
 k number;
 l number;
 m number;
 p number;
 q number;

 ano number := 2002;

 dt_pascoa date;
 dt_carnaval_segunda date;
 dt_carnaval_terca date;
 dt_carnaval_quarta date;
 dt_sextasanta date;
 dt_corpusc  date;

begin
   while ano <= 2015
   loop
     a := mod(ano , 19);
     b := trunc(ano / 100);
     c :=  mod(ano, 100);
     d := trunc(b / 4);
     e := (b mod 4);
     f := trunc((b + 8) / 25);
     g := trunc((b - f + 1) / 3) ;
     h := mod((19 * a + b - d - g + 15) , 30);
     i := trunc(c / 4);
     k := mod(c , 4);
     l := mod((32 + 2 * e + 2 * i - h - k), 7);
     m := trunc((a + 11 * h + 22 * l) / 451);
     p := trunc((h + l - 7 * m + 114) / 31);
     q := mod((h + l - 7 * m + 114) , 31);

     dt_pascoa := to_date (((q + 1) ||  '/' || p || '/' || ano),'dd/mm/yyyy');
     dt_carnaval_segunda := (dt_pascoa-48);
     dt_carnaval_terca := (dt_pascoa-47);
     dt_carnaval_quarta := (dt_pascoa-46);
     dt_sextasanta := (dt_pascoa-2);
     dt_corpusc := (dt_pascoa+60);  

     dbms_output.put_line(quotedstr(to_char(dt_carnaval_segunda,'dd/mm/yyyy'))||' /*carnaval_segunda*/,'||
                          quotedstr(to_char(dt_carnaval_terca,'dd/mm/yyyy'))||' /*carnaval_terca*/,'||
                          quotedstr(to_char(dt_carnaval_quarta,'dd/mm/yyyy'))||' /*carnaval_quarta*/,'||
                          quotedstr(to_char(dt_sextasanta,'dd/mm/yyyy'))||' /*sextasanta*/,'||
                          quotedstr(to_char(dt_corpusc,'dd/mm/yyyy'))||' /*corpuschristie*/,');


     ano := ano + 1;
   end loop;
   /*
   baseado em
   http://www.vbweb.com.br/dicas_visual.asp?codigo=2033
   */
end;

Share this post


Link to post
Share on other sites

×

Important Information

Ao usar o fórum, você concorda com nossos Terms of Use.