Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Determinando as datas da Páscoa para qualquer ano no Oracle PLSQL

Determinando as datas da Páscoa para qualquer ano  no Oracle PLSQL

ProblemaVocê gostaria de determinar dinamicamente as datas da Páscoa para um determinado ano.SolutionOracle não fornece uma função única e elegante para realizar cálculos de Páscoa para você. Mas o Oracle tem funções aritméticas de data robustas que podemos usar para construir nossa própria calculadora de Páscoa. Isso levanta a questão, como decidimos as datas da Páscoa de qualquer maneira? Para a Páscoa no calendário gregoriano, o Domingo de Páscoa é o domingo seguinte à primeira lua cheia após a Quaresma. Algoritmos contemporâneos traduzem isso para o primeiro domingo após a primeira lua cheia em ou depois de 21 de março. A próxima função retorna a data do domingo de Páscoa para um ano especificado. crie ou substitua a função easter_sunday(given_year number) return dateasgolden_metonic number; century number;leap_year_fix number;lunar_sync number;sunday_date number;epact number;day_of_month number;easter_offset number;begingolden_metonic :=mod(given_year,19) + 1;century :=(given_year / 100) + 1;leap_year_fix :=(3 * século / 4) - 12;lunar_sync :=((8 * século + 5)/25) - 5;sunday_date :=(5 * dado_year / 4) - jump_year_fix - 3;epac :=mod((11 * golden_metonic + 20 + lunar_sync - leap_year_fix) ,30);if((epact =25 e golden_metonic <11) ou (epact =24)) theepact :=epact + 1;end if;day_of_month :=44 - epact;if(day_of_month <21) thenday_of_month :=day_of_month + 30;end if;easter_offset :=(day_of_month + 7 - mod((doming_date + day_of_month),7)) - 1;return to_date('01-MAR-' || to_char(given_year),'DD -MON-YYYY') + easter_offset;end;/Poderíamos ter codificado isso em SQL puro como um grande conjunto aninhado de instruções IF e CASE, mas essa função é mais fácil de ler e mais fácil de usar na prática. Agora podemos encontrar a Páscoa para qualquer ano, como 2000 mostrado na próxima instrução SQL.select easter_sunday(2000)from dual;EASTER_SUNDAY-------------23-APR-00Também podemos determinar dinamicamente Domingo de Páscoa para o ano atual sem a necessidade de indicar explicitamente o ano. A próxima instrução SQL ilustra isso em action.select easter_sunday(extract(year from (sysdate)))from dual;EASTER_SUNDAY-------------
12-ABR-09