Zum Inhalt dieser Seite

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