SQL-Server - 'Feiertagsberechnungen'
Mit Hilfe der aufgeführten Funktion kann kontrolliert werden, ob es sich bei einem Datum um einen Feiertag handelt. Natürlich gibt es auch einen Download der hier vorgestellten Funktion (bitte auf den folgenden Link klicken): (18 kByte) . Darin enthalten sind: Diese Funktion, Beispiel einer Sicht, Feiertage von 1990 bis 2005 im CSV- und Access 2000-Format.
CREATE FUNCTION isArbeitstag(@cDatum DATETIME, @typus AS INTEGER) /* @cdatum= Datum, das kontrolliert werden soll @typus = 0 (nur Wochenenden) @typus = 1 (Bundesweite Feiertage und Wochenenden) @typus = 2 (Alle Feiertage und Wochenenden) Beispielhafte Übergabewerte: ---------------------------- '1,Neujahr' '2,Heilige drei Könige' '0,Samstag' '0,Sonntag' '9,Arbeitstag' !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! Bitte die Einstellungen von "Datepart" kontrollieren Für Sonntage muss datepart(weekday,@cdatum)=7 gelten Wenn dies nicht zutrifft, dann müssen alle Aufrufe dieser Funktion entsprechend angepasst werden (Auch beim Buß- und Bettag) !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! */ RETURNS VARCHAR(27) AS BEGIN DECLARE @M AS INTEGER DECLARE @N AS INTEGER DECLARE @a AS INTEGER DECLARE @B AS INTEGER DECLARE @C AS INTEGER DECLARE @d AS INTEGER DECLARE @e AS INTEGER DECLARE @Tag AS INTEGER DECLARE @mon AS INTEGER DECLARE @xJahr AS INTEGER DECLARE @TagDerWoche AS INTEGER DECLARE @strJahr AS VARCHAR(4) DECLARE @Datum AS DATETIME DECLARE @datOsterSonntag AS DATETIME IF @typus=0 BEGIN -- nur Wochenenden IF DATEPART(weekday,@cdatum)=6 BEGIN RETURN '0,Samstag' END IF DATEPART(weekday,@cdatum)=7 BEGIN RETURN '0,Sonntag' END END ELSE BEGIN -- Feiertage und Wochenenden SET @xJahr=YEAR(@cDatum) SET @strJahr=CONVERT(VARCHAR(4),@xJahr) SET @M = 23 SET @N = 3 IF @xJahr > 1799 BEGIN SET @N = 4 END IF @xJahr > 1899 BEGIN SET @N = @N + 1 SET @M = 24 END IF @xJahr > 2099 BEGIN SET @N = @N + 1 END SET @a = @xJahr % 19 SET @B = @xJahr % 4 SET @C = @xJahr % 7 SET @d = ((@a * 19) + @M) % 30 SET @e = ((@B * 2) + (@C * 4) + (@d * 6) + @N) % 7 SET @Tag = @d + @e + 22 IF @Tag > 31 BEGIN SET @Tag = @Tag - 31 IF (@Tag = 26) Or ((@Tag = 25) And (@d = 28) And (@a > 10)) BEGIN SET @Tag = @Tag - 7 END SET @mon = 4 END ELSE BEGIN SET @mon = 3 END SET @datum = CONVERT(DATETIME,CONVERT(VARCHAR(2),@tag) +'.' + CONVERT(VARCHAR(2),@mon) + '.' + @strJahr) --Ostersonntag SET @datOsterSonntag = @Datum IF DATEDIFF(DAY,@cdatum,@datum) = 0 BEGIN RETURN '1,Ostersonntag' END --Karfreitag SET @datum = DATEADD(DAY,-2,@datOsterSonntag) IF DATEDIFF(DAY,@cdatum,@datum) = 0 BEGIN RETURN '1,Karfreitag' END --Ostermontag SET @datum = DATEADD(DAY,1,@datOsterSonntag) IF DATEDIFF(DAY,@cdatum,@datum) = 0 BEGIN RETURN '1,Ostermontag' END --Pfingstsonntag SET @datum = DATEADD(DAY,49,@datOsterSonntag) IF DATEDIFF(DAY,@cdatum,@datum) = 0 BEGIN RETURN '1,Pfingstsonntag' END --Pfingstmontag SET @datum = DATEADD(DAY,50,@datOsterSonntag) IF @cdatum=@datum BEGIN RETURN '1,Pfingstmontag' END --Chr.Himmelfahrt SET @datum = DATEADD(DAY,39,@datOsterSonntag) IF DATEDIFF(DAY,@cdatum,@datum) = 0 BEGIN RETURN '1,Christi Himmelfahrt' END --Fronleichnam SET @datum = DATEADD(DAY,60,@datOsterSonntag) IF DATEDIFF(DAY,@cdatum,@datum) = 0 BEGIN IF @typus=2 BEGIN RETURN '2,Fronleichnam' END ELSE BEGIN IF DATEPART(weekday,@cdatum)=6 BEGIN RETURN '0,Samstag' END IF DATEPART(weekday,@cdatum)=7 BEGIN RETURN '0,Sonntag' END END END --Buß+Bettag SET @datum = CONVERT(DATETIME,'01.11.' + @strJahr) SET @TagDerWoche = 0 WHILE @TagDerWoche <>3 BEGIN SET @TagDerWoche=DATEPART(weekday,@datum) IF @TagderWoche=3 BEGIN SET @datum=DATEADD(DAY,14,@datum) END ELSE BEGIN SET @datum=DATEADD(DAY,1,@datum) END END IF DAY(@datum) < 16 BEGIN SET @datum = DATEADD(DAY,7,@datum) END IF DATEDIFF(DAY,@cdatum,@datum) = 0 BEGIN IF @typus=2 BEGIN RETURN '2,Buß- und Bettag' END ELSE BEGIN IF DATEPART(weekday,@cdatum)=6 BEGIN RETURN '0,Samstag' END IF DATEPART(weekday,@cdatum)=7 BEGIN RETURN '0,Sonntag' END END END -- feste Feiertage SET @datum = CONVERT(DATETIME,'01.01.' + @strJahr) IF DATEDIFF(DAY,@cdatum,@datum) = 0 BEGIN RETURN '1,Neujahr' END SET @datum = CONVERT(DATETIME,'06.01.' + @strJahr) IF DATEDIFF(DAY,@cdatum,@datum) = 0 BEGIN IF @typus=2 BEGIN RETURN '2,Heilige drei Könige' END ELSE BEGIN IF DATEPART(weekday,@cdatum)=6 BEGIN RETURN '0,Samstag' END IF DATEPART(weekday,@cdatum)=7 BEGIN RETURN '0,Sonntag' END END END SET @datum = CONVERT(DATETIME,'01.05.' + @strJahr) IF DATEDIFF(DAY,@cdatum,@datum) = 0 BEGIN RETURN '1,Maifeiertag' END SET @datum = CONVERT(DATETIME,'03.10.' + @strJahr) IF DATEDIFF(DAY,@cdatum,@datum) = 0 BEGIN RETURN '1,Tag der deutschen Einheit' END SET @datum = CONVERT(DATETIME,'15.08.' + @strJahr) IF DATEDIFF(DAY,@cdatum,@datum) = 0 BEGIN IF @typus=2 BEGIN RETURN '2,Mariä Himmelfahrt' END ELSE BEGIN IF DATEPART(weekday,@cdatum)=6 BEGIN RETURN '0,Samstag' END IF DATEPART(weekday,@cdatum)=7 BEGIN RETURN '0,Sonntag' END END END SET @datum = CONVERT(DATETIME,'31.10.' + @strJahr) IF DATEDIFF(DAY,@cdatum,@datum) = 0 BEGIN IF @typus=2 BEGIN RETURN '2,Reformationstag' END ELSE BEGIN IF DATEPART(weekday,@cdatum)=6 BEGIN RETURN '0,Samstag' END IF DATEPART(weekday,@cdatum)=7 BEGIN RETURN '0,Sonntag' END END END SET @datum = CONVERT(DATETIME,'01.11.' + @strJahr) IF DATEDIFF(DAY,@cdatum,@datum) = 0 BEGIN IF @typus=2 BEGIN RETURN '2,Allerheiligen' END ELSE BEGIN IF DATEPART(weekday,@cdatum)=6 BEGIN RETURN '0,Samstag' END IF DATEPART(weekday,@cdatum)=7 BEGIN RETURN '0,Sonntag' END END END SET @datum = CONVERT(DATETIME,'25.12.' + @strJahr) IF DATEDIFF(DAY,@cdatum,@datum) = 0 BEGIN RETURN '1,1. Weihnachtstag' END SET @datum = CONVERT(DATETIME,'26.12.' + @strJahr) IF DATEDIFF(DAY,@cdatum,@datum) = 0 BEGIN RETURN '1,2. Weihnachtstag' END IF DATEPART(weekday,@cdatum)=6 BEGIN RETURN '0,Samstag' END IF DATEPART(weekday,@cdatum)=7 BEGIN RETURN '0,Sonntag' END END RETURN '9,Arbeitstag' END
Eine Sicht könnte z.B. so ausschauen:
SELECT Datumsfeld, Feiertag, Bundesweit, dbo.isArbeitstag(Datumsfeld, 1) AS BundesweitUndWo, dbo.isArbeitstag(Datumsfeld, 2) AS AlleUndWo, dbo.isArbeitstag(Datumsfeld, 0) AS NurWo FROM dbo.Feiertage