Określanie dat Wielkanocy dla dowolnego roku w Oracle PLSQL
ProblemChciałbyś dynamicznie określać daty Wielkanocy na dany rok.RozwiązanieOracle nie udostępnia jednej, eleganckiej funkcji do wykonywania obliczeń wielkanocnych za Ciebie. Ale Oracle ma solidne funkcje arytmetyczne dat, których możemy użyć do zbudowania własnego kalkulatora wielkanocnego. Nasuwa się pytanie, jak w ogóle ustalamy daty Wielkanocy? W przypadku Wielkanocy według kalendarza gregoriańskiego, Niedziela Wielkanocna to niedziela po pierwszej pełni księżyca po Wielkim Poście. Współczesne algorytmy tłumaczą to na pierwszą niedzielę po pierwszej pełni księżyca 21 marca lub później.Następna funkcja zwraca datę Niedzieli Wielkanocnej dla określonego roku.utwórz lub zamień funkcję easter_sunday(podany_rok) return dateaszłota_liczba metoniczna;liczba wieku;liczba_roku_przestępnego;lunar_sync numer;niedziela_data;numer epact;dzień_miesiąca;numer_przesunięcia wielkanocnego;begingolden_metonic :=mod(dany_rok,19) + 1;wiek :=(podany_rok / 100) + 1;poprawka_roku przestępnego :=(3 * wiek / 4) - 12;lunar_sync :=((8 * wiek + 5)/25) - 5;niedziela_data :=(5 * dany_rok / 4) - przestępny_rok - 3;epact :=mod((11 * golden_metonic + 20 + lunar_sync - przestępny_rok) ,30);if((epact =25 i golden_metonic <11) or (epact =24)) thenepact :=epact + 1;end if;dzień_miesiąca :=44 - epact;if(dzień_miesiąca <21) thenday_of_month :=dzień_miesiąca + 30;end if;easter_offset :=(dzień_miesiąca + 7 - mod((niedziela_data + dzień_miesiąca),7)) - 1;return to_date('01-MAR-' || to_char(podany_rok),'DD -MON-YYYY') + easter_offset;end;/ Mogliśmy to zakodować w czystym SQL jako jeden dość duży zagnieżdżony zestaw instrukcji IF i CASE, ale ta funkcja jest zarówno łatwiejsza do odczytania, jak i łatwiejsza w użyciu w praktyce. Możemy teraz znaleźć Wielkanoc dla dowolnego roku, na przykład 2000 pokazaną w następnej instrukcji SQL.select easter_sunday(2000)z dual;EASTER_SUNDAY-----------Kwiczeń-00Możemy również określać dynamicznie Niedziela Wielkanocna w bieżącym roku bez konieczności wyraźnego określania roku. Następna instrukcja SQL ilustruje to w akcji.select easter_sunday(extract(year from (sysdate)))z dual;EASTER_SUNDAY -------------12.04.09