Určení dat Velikonoc pro kterýkoli rok v Oracle PLSQL
Problém Chtěli byste dynamicky určit data Velikonoc pro daný rok. ŘešeníOracle neposkytuje jedinou elegantní funkci, která by za vás provedla výpočty Velikonoc. Ale Oracle má robustní aritmetické funkce pro datum, které můžeme použít k vytvoření naší vlastní velikonoční kalkulačky. To vyvolává otázku, jak vůbec rozhodujeme o datech Velikonoc? Pro Velikonoce podle gregoriánského kalendáře je Velikonoční neděle neděle následující po prvním úplňku po půstu. Současné algoritmy to převádějí na první neděli po prvním úplňku 21. března nebo později. Další funkce vrátí datum velikonoční neděle pro zadaný rok. vytvořit nebo nahradit funkci easter_sunday(dané_rokové číslo) vrátit datum jako zlaté_metonické číslo;číslo století;číslo_přesného_roku;číslo lunar_sync;číslo_nedělního_datu;číslo dohody;číslo dne_měsíce;číslo_velikonočního offsetu;begingolden_metonic :=mod(daný_rok,19) + 1;století :=(daný_rok / 100) + 1;fix_přestupného_roku :=(3 * století / 4) - 12;lunar_sync :=((8 * století + 5)/25) - 5;nedělní_datum :=(5 * daný_rok / 4) - oprava_přestupného_roku - 3;epak :=mod((11 * zlatá_metonicka + 20 + lunar_sync - oprava_přestupného_roku) ,30);if((epakta =25 a zlatá_metonická <11) nebo (epakta =24)) thenepakta :=epakta + 1;konec if;den_měsíce :=44 - epakt;if(den_měsíce <21) thenden_měsíce :=den_měsíce + 30;end if;easter_offset :=(den_měsíce + 7 - mod((nedělní_datum + den_měsíce),7)) - 1;return to_date('01-MAR-' || to_char(given_year),'DD -MON-YYYY') + easter_offset;end;/Mohli jsme to zakódovat v čistém SQL jako jednu poměrně velkou vnořenou sadu příkazů IF a CASE, ale tato funkce je snáze čitelná a snáze použitelná v praxi. Nyní můžeme najít Velikonoce pro jakýkoli daný rok, například 2000 zobrazený v dalším SQL příkazu.select easter_sunday(2000)from dual;EASTER_SUNDAY-------------23-APR-00Můžeme také dynamicky určit Velikonoční neděle pro aktuální rok, aniž by bylo nutné výslovně uvádět rok. Následující příkaz SQL to ilustruje v action.select easter_sunday(extract(year from (sysdate)))from dual;EASTER_SUNDAY--------------12. dubna 2009