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