Bewegliche und feste Feiertage in NRW und Deutschland

PL/SQL Funktion zur Ermittlung von Ostern

Erstellen einer Kalendertabelle für Feiertage

Erstellen eines Feiertagskalenders

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;

Inhalt

Erstellen einer Kalendertabelle für Feiertage

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)

Inhalt

Erstellen eines Feiertagskalenders

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;

Inhalt