Determinazione delle date di Pasqua per qualsiasi anno in Oracle PLSQL
ProblemaVorresti determinare dinamicamente le date di Pasqua per un determinato anno.SolutionOracle non fornisce un'unica ed elegante funzione per eseguire i calcoli di Pasqua per te. Ma Oracle ha solide funzioni aritmetiche della data che possiamo utilizzare per costruire il nostro calcolatore di Pasqua. Questo pone la domanda, come decidiamo comunque le date della Pasqua? Per la Pasqua secondo il calendario gregoriano, la domenica di Pasqua è la domenica successiva al primo plenilunio dopo la Quaresima. Gli algoritmi contemporanei lo traducono nella prima domenica dopo la prima luna piena il 21 marzo o dopo. La funzione successiva restituisce la data della domenica di Pasqua per un anno specificato. Crea o sostituisci la funzione easter_sunday(numero_anno) return dateasgolden_metonic numero;numero del secolo;anno_leap numero_fix;numero_sincronizzazione_lunare;numero_data_domenica;numero epact;numero_giorno_del_mese;numero_offset_pasquale;begingolden_metonic :=mod(anno_dato,19) + 1;secolo :=(anno_dato / 100) + 1;correzione anno_bisestile :=(3 * secolo / 4) - 12;lunar_sync :=((8 * secolo + 5)/25) - 5;sunday_date :=(5 * anno_dato / 4) - leap_year_fix - 3;epact :=mod((11 * golden_metonic + 20 + lunar_sync - leap_year_fix) ,30);if((epact =25 e golden_metonic <11) or (epact =24)) thenepact :=epact + 1;end if;giorno_del_mese :=44 - epact;if(giorno_del_mese <21) thenday_of_mese :=giorno_del_mese + 30;end if;easter_offset :=(giorno_del_mese + 7 - mod((domenica_data + giorno_del_mese),7)) - 1;return to_date('01-MAR-' || to_char(given_year),'DD -MON-YYYY') + easter_offset;end;/Potremmo averlo codificato in puro SQL come un insieme nidificato piuttosto grande di istruzioni IF e CASE, ma questa funzione è sia più facile da leggere che da usare in pratica. Ora possiamo trovare la Pasqua per un dato anno, come il 2000 mostrato nella prossima istruzione SQL.select easter_sunday(2000)from dual;EASTER_SUNDAY-------------23-APR-00Possiamo anche determinare dinamicamente Domenica di Pasqua per l'anno in corso senza la necessità di indicare esplicitamente l'anno. L'istruzione SQL successiva lo illustra in action.select easter_sunday(extract(year from (sysdate)))from dual;EASTER_SUNDAY-------------12-APR-09