Deutsche Feiertage berechnen ist etwas was man in Oracle so nicht findet. Um aber dennoch Feiertage zu ermitteln, habe ich diese Funktion geschrieben. In der Berechnung der Feiertage sind alle Gesetzlichen Deutschen Feiertage enthalten. Diese Funktion benötigt die Funktion Ostersonntag!
Parameter
Parameter Name
Parameter Wert
holidaynumber
Nummer des zu ermittelnden Feiertages. Mögliche Nummern siehe Liste der Feiertage
yeartocalc
Das Jahr für das Feiertag ermittelt werden soll
Rückgabe
Rückgabe Typ
Rückgabe Wert
Date
Datum des Feiertages
Liste der Feiertage
Neujahr = 1
Erscheinungsfest = 2
Karfreitag = 3
Ostersonntag = 4
Ostermontag = 5
Maifeiertag = 6
Christi Himmelfahrt = 7
Pfingstmontag = 8
Fronleichnam = 9
Mariae Himmelfahrt = 10
Tag der Einheit = 11
Reformationstag = 12
Allerheiligen = 13
Buss und Bettag = 14
1. Weihnachtsfeiertag = 15
2. Weihnachtsfeiertag = 16
Code
CREATE OR REPLACE FUNCTION holiday(holidaynumber NUMBER, yeartocalc NUMBER DEFAULT to_number(to_char(SYSDATE,'YYYY')))
RETURN DATE
IS
RESULT DATE;
BEGIN
IF holidaynumber = 1 THEN
--Neujahr
RESULT := to_date('01.01.'
|| yeartocalc, 'DD.MM.YYYY');
ELSIF holidaynumber = 2 THEN
--Erscheinungsfest
RESULT := to_date('06.01.'
|| yeartocalc, 'DD.MM.YYYY');
ELSIF holidaynumber = 3 THEN
--Karfreitag
RESULT := eastern(yeartocalc) - 2;
ELSIF holidaynumber = 4 THEN
--Ostersonntag
RESULT := eastern(yeartocalc);
ELSIF holidaynumber = 5 THEN
--Ostermontag
RESULT := eastern(yeartocalc) + 1;
ELSIF holidaynumber = 6 THEN
--Maifeiertag
RESULT := to_date('01.05.'
|| yeartocalc, 'DD.MM.YYYY');
ELSIF holidaynumber = 7 THEN
--ChristiHimmelfahrt
RESULT := eastern(yeartocalc) + 39;
ELSIF holidaynumber = 8 THEN
--Pfingstmontag
RESULT := eastern(yeartocalc) + 50;
ELSIF holidaynumber = 9 THEN
--Fronleichnam
RESULT := eastern(yeartocalc) + 60;
ELSIF holidaynumber = 10 THEN
--MariaeHimmelfahrt
RESULT := to_date('15.08.'
|| yeartocalc, 'DD.MM.YYYY');
ELSIF holidaynumber = 11 THEN
--TagDerEinheit
RESULT := to_date('03.10.'
|| yeartocalc, 'DD.MM.YYYY');
ELSIF holidaynumber = 12 THEN
--Reformationstag
RESULT := to_date('31.10.'
|| yeartocalc, 'DD.MM.YYYY');
ELSIF holidaynumber = 13 THEN
--Allerheiligen
RESULT := to_date('01.11.'
|| yeartocalc, 'DD.MM.YYYY');
ELSIF holidaynumber = 14 THEN
--BussUndBettag
RESULT := to_date('25.12.'
|| yeartocalc, 'DD.MM.YYYY') - to_char(to_date('25.12.'
|| yeartocalc, 'DD.MM.YYYY'), 'D') - 4 * 7 * 4;
ELSIF holidaynumber = 15 THEN
--Weihnachtsfeiertag1
RESULT := to_date('25.12.'
|| yeartocalc, 'DD.MM.YYYY');
ELSIF holidaynumber = 16 THEN
--Weihnachtsfeiertag2
RESULT := to_date('26.12.'
|| yeartocalc, 'DD.MM.YYYY');
END IF;
RETURN(RESULT);
END holiday;