Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Bestimmen der Osterdaten für jedes Jahr in Oracle PLSQL

Ermitteln der Osterdaten für jedes Jahr in Oracle PLSQL

ProblemSie möchten die Osterdaten für ein bestimmtes Jahr dynamisch bestimmen. LösungOracle bietet keine einzige, elegante Funktion, um Osterberechnungen für Sie durchzuführen. Aber Oracle hat robuste Datumsarithmetikfunktionen, die wir verwenden können, um unseren eigenen Osterrechner zu bauen. Dies wirft die Frage auf, wie wir die Ostertermine überhaupt festlegen? Für Ostern im gregorianischen Kalender ist der Ostersonntag der Sonntag nach dem ersten Vollmond nach der Fastenzeit. Moderne Algorithmen übersetzen dies in den ersten Sonntag nach dem ersten Vollmond am oder nach dem 21. März. Die nächste Funktion gibt das Datum des Ostersonntags für ein bestimmtes Jahr zurück. create or replace function easter_sunday(given_year number) return dateasgolden_metonic number;century number;leap_year_fix number;Mond_Sync-Nummer;Sonntag_Datum-Nummer;epact Nummer;day_of_month Nummer;easter_offset Nummer;begingolden_metonic :=mod(given_year,19) + 1;century :=(given_year / 100) + 1;leap_year_fix :=(3 * century / 4) - 12;lunar_sync :=((8 * Jahrhundert + 5)/25) - 5;sunday_date :=(5 * gegebenes_Jahr / 4) - Schaltjahr_fix - 3;epact :=mod((11 * golden_metonic + 20 + lunar_sync - Schaltjahr_fix) ,30);if((epact =25 and golden_metonic <11) or (epact =24)) thenepact :=epact + 1;end if;day_of_month :=44 - epact;if(day_of_month <21) thenday_of_month :=day_of_month + 30;ende if;easter_offset :=(day_of_month + 7 - mod((sunday_date + day_of_month),7)) - 1;return to_date('01-MAR-' || to_char(given_year),'DD -MON-YYYY') + easter_offset;end;/Wir hätten dies in reinem SQL als eine ziemlich große verschachtelte Menge von IF- und CASE-Anweisungen codieren können, aber diese Funktion ist sowohl einfacher zu lesen als auch in der Praxis einfacher zu verwenden. Wir können jetzt Ostern für jedes gegebene Jahr finden, z. B. 2000, das in der nächsten SQL-Anweisung gezeigt wird. select easter_sunday(2000) from dual;EASTER_SUNDAY-------------23-APR-00Wir können auch dynamisch bestimmen Ostersonntag für das laufende Jahr, ohne dass das Jahr explizit angegeben werden muss. Die nächste SQL-Anweisung veranschaulicht dies in Aktion. select easter_sunday(extract(year from (sysdate)))from dual;EASTER_SUNDAY-------------

12-APR-09