![]()
PL/SQL Funktion zur Ermittlung von Ostern
CREATE OR REPLACE function ostern(j number) return date
is
-- ***********************************************************************************************
--
-- NAME: ostern
--
-- Ermittelt das Datum für Ostersonntag zum übergebenen Jahr
-- Aufgrund des Ostertages lassen sich folgende bewegliche Feiertage berechnen:
--
-- Weiber-Karneval Ostern - 52 Tage
-- Rosen Montag Ostern - 48 Tage
-- Karnevals Dienstag Ostern - 47 Tage
-- Ascher Mittwoch Ostern - 46 Tage
-- Karfreitag Ostern - 2 Tage
-- Ostersonntag Ostern
-- Ostermontag Ostern + 1 Tag
-- Christi Himmelsfahrt Ostern + 39 Tage
-- Pfingstsonntag Ostern + 49
-- Pfingstmontag Ostern + 50
-- Fronleichnam Ostern + 60
--
-- PARAM: Jahr 4 Stellig
--
-- RETURNS: Datum auf das in dem übergebenen Jahr Osern fällt
--
-- CREATED: 11.11.2004 Gregor Neveling
--
-- ***********************************************************************************************
A number;
B number;
C number;
D number;
E number;
M number;
N number;
P number;
v_ostern date;
begin
A := J Mod 19;
B := J Mod 4;
C := J Mod 7;
M := 24;
N := 5;
D := (19 * A + M) Mod 30;
E := (2 * B + 4 * C + 6 * D + N) Mod 7;
P := 22 + D + E;
If P > 31 Then
If P = 56
And D = 28
And A > 10 Then
v_ostern := to_date((j*10000) + (4 * 100) + 18,'yyyymmdd');
ElsIf P = 57 Then
v_ostern := to_date((j*10000) + (4 * 100) + 18,'yyyymmdd');
Else
v_ostern := to_date((j*10000) + (4 * 100) + p - 31,'yyyymmdd');
End If;
Else
v_ostern := to_date((j*10000) + (3 * 100) + p, 'yyyymmdd');
End If;
return v_ostern;
end;
CREATE TABLE FEIERTAGE
(JAHR NUMBER(4),
MONAT NUMBER(2),
TAG NUMBER(2),
KW NUMBER(2),
WOCHENTAG VARCHAR2(20),
DATUM DATE,
FEIERTAG VARCHAR2(30),
AKTIV CHAR(1));
-- (Die Tablespace und Storageangeaben sind hier der Einfachheit halber weggelassen)
CREATE OR REPLACE procedure feiertage_fuellen(j number)
is
--
--
--
procedure insert_date(p_datum date, p_bez varchar2, p_aktiv char)
is
begin
insert into feiertage (jahr,
monat,
tag,
kw,
wochentag,
datum,
feiertag,
aktiv)
values (to_char(p_datum,'yyyy'),
to_char(p_datum,'mm'),
to_char(p_datum,'dd'),
to_char(p_datum,'iw'),
to_char(p_datum,'day'),
p_datum,
p_bez,
p_aktiv);
exception
when others then null;
end insert_date;
begin
-- Arbeitsfreie Feiertage
delete from FEIERTAGE where jahr = j;
insert_date(to_date('01.01.'||j,'dd.mm.yyyy'),'Neujahr','1');
insert_date(to_date('01.05.'||j,'dd.mm.yyyy'),'Tag der Arbeit','1');
insert_date(to_date('03.10.'||j,'dd.mm.yyyy'),'Tag der deutschen Einheit','1');
insert_date(to_date('01.11.'||j,'dd.mm.yyyy'),'Allerheiligen','1');
insert_date(to_date('25.12.'||j,'dd.mm.yyyy'),'1.Weihnachtstag','1');
insert_date(to_date('26.12.'||j,'dd.mm.yyyy'),'2.Weihnachtstag','1');
insert_date(ostern(j) - 2,'Karfreitag','1');
insert_date(ostern(j),'Ostern','1');
insert_date(ostern(j) + 1,'Ostermontag','1');
insert_date(ostern(j) + 39,'Christi Himmelfahrt','1');
insert_date(ostern(j) + 49,'Pfingsten','1');
insert_date(ostern(j) + 50,'Pfingstmontag','1');
insert_date(ostern(j) + 60,'Frohnleichnam','1');
-- keine Arbeitsfreien Tage
insert_date(ostern(j) - 46,'Aschermittwoch','0');
insert_date(ostern(j) - 47,'Karnelvalsdienstag','0');
insert_date(ostern(j) - 48,'Rosenmontag','0');
insert_date(ostern(j) - 52,'Weiberfastnacht','0');
insert_date(to_date('24.12.'||j,'dd.mm.yyyy'),'Heiligabend','0');
insert_date(to_date('31.12.'||j,'dd.mm.yyyy'),'Silvester','0');
insert_date(to_date('02.11.'||j,'dd.mm.yyyy'),'Allerseelen','0');
insert_date(to_date('11.11.'||j,'dd.mm.yyyy'),'Martin','0');
insert_date(to_date('31.10.'||j,'dd.mm.yyyy'),'Reformationstag, Halloween','0');
insert_date(to_date('06.12.'||j,'dd.mm.yyyy'),'Nikolaus','0');
insert_date(to_date('15.08.'||j,'dd.mm.yyyy'),'Mariähimmelfahrt','0');
insert_date(to_date('21.03.'||j,'dd.mm.yyyy'),'Frühlingsanfang','0');
insert_date(to_date('21.06.'||j,'dd.mm.yyyy'),'Sommeranfang','0');
insert_date(to_date('23.09.'||j,'dd.mm.yyyy'),'Herbstanfang','0');
insert_date(to_date('22.12.'||j,'dd.mm.yyyy'),'Winteranfang','0');
commit;
end feiertage_fuellen;