SQL Add-Ons für Datumsoperationen

Weil ich diese Funktionen immer wieder benötige und nicht jedes Mal erneut danach suchen möchte, sammle ich die wichtigsten an dieser Stelle.

Arbeitstag, Wochenende oder Feiertag?

Diese Funktion liefert AT wenn es sich um einen Arbeitstag handelt, ansonsten Samstag, Sonntag oder die Bezeichnung des Feiertags. Die Funktion ist für Österreich optimiert und könnte natürlich noch um weitere Länder (inkl. Parameter) erweitert werden.

CREATE Function [dbo].[Arbeitstag](@FuerDatum datetime) returns varchar(50) 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 @Monat As Integer
Declare @Jahr as Integer
Declare @TdW As Integer
Declare @strJahr As char(4)
Declare @Datum As Datetime
Declare @OsterSonntag As Datetime
Declare @BBTag As Datetime

Declare @SA as integer
Declare @SO as integer

Declare @RetWert as varchar(50)

— Wochenstart angeben durch setzen der Wochentage für Samstag und Sonntag
set @SA = 6
set @SO = 7

— Standardrückgabewert: AT für Arbeitstag
set @RetWert = ‚AT‘
set @Jahr = year(@FuerDatum)
set @strJahr = convert(char(4),@Jahr)

— Verwendung der Gauss’schen Formel für Berechnung des Osterdatums (siehe https://www.tecchannel.de/a/feiertage-berechnen-und-beruecksichtigen-teil-1,465188)
if @Jahr not between 1700 and 2199
begin
set @RetWert = NULL
end
else
begin
set @RetWert = case datepart(weekday,@FuerDatum)
when @SA then ‚Samstag‘
when @SO then ‚Sonntag‘
else @RetWert
end

set @M = case
when @Jahr between 1700 and 1899 then 23
when @Jahr between 1900 and 2199 then 24
else 0
end

set @N = case
when @Jahr between 1700 and 1799 then 3
when @Jahr between 1800 and 1899 then 4
when @Jahr between 1900 and 2099 then 5
when @Jahr between 2100 and 2199 then 6
else 0
end

set @A = @Jahr % 19
set @B = @Jahr % 4
set @C = @Jahr % 7
set @D = ((@A * 19) + @M) % 30
set @E = ((@B * 2) + (@C * 4) + (@D * 6) + @N) % 7

— Tag
set @Tag = case
when @D + @E + 22 > 31 then @D + @E -9 — April
else @D + @E + 22 — März
end

— Monat
set @Monat = case
when @D + @E + 22 > 31 then 4 — April
else 3 — März
end

— Sonderfall für zwei Tage im April
set @Tag = case
when @Tag = 25 and @Monat = 4 and @D=28 and @A>10 then 18
when @Tag = 26 and @Monat = 4 then 19
else @Tag
end

set @Datum = convert(Datetime,@strJahr + ‚-‚ + substring(convert(char(3),@Monat+100),2,2) + ‚-‚ + substring(convert(char(3),@Tag +100),2,2))

–Ostersonntag
set @OsterSonntag = @Datum

— Berechnung der Feiertage
set @RetWert = case
— DE when datediff(day,@OsterSonntag,@FuerDatum) = -2 then ‚Karfreitag‘
when datediff(day,@OsterSonntag,@FuerDatum) = 0 then ‚Ostersonntag‘
when datediff(day,@OsterSonntag,@FuerDatum) = 1 then ‚Ostermontag‘
when datediff(day,@OsterSonntag,@FuerDatum) = 39 then ‚Christi Himmelfahrt‘
when datediff(day,@OsterSonntag,@FuerDatum) = 49 then ‚Pfingstsonntag‘
when datediff(day,@OsterSonntag,@FuerDatum) = 50 then ‚Pfingstmontag‘
when datediff(day,@OsterSonntag,@FuerDatum) = 60 then ‚Fronleichnam‘

— Feste Feiertage
when convert(datetime,@strJahr + ‚-01-01‘, 120) = @FuerDatum then ‚Neujahr‘
when convert(datetime,@strJahr + ‚-01-06‘, 120) = @FuerDatum then ‚Heilige drei Könige‘
when convert(datetime,@strJahr + ‚-05-01‘, 120) = @FuerDatum then ‚Staatsfeiertag‘
–DE when convert(datetime,@strJahr + ‚-10-03‘, 120) = @FuerDatum then ‚Tag der deutschen Einheit‘
when convert(datetime,@strJahr + ‚-08-15‘, 120) = @FuerDatum then ‚Mariä Himmelfahrt‘
when convert(datetime,@strJahr + ‚-10-26‘, 120) = @FuerDatum then ‚Nationalfeiertag‘
when convert(datetime,@strJahr + ‚-11-01‘, 120) = @FuerDatum then ‚Allerheiligen‘
when convert(datetime,@strJahr + ‚-12-08‘, 120) = @FuerDatum then ‚Maria Empfängnis‘
when convert(datetime,@strJahr + ‚-12-24‘, 120) = @FuerDatum then ‚Heiliger Abend‘
when convert(datetime,@strJahr + ‚-12-25‘, 120) = @FuerDatum then ‚Christtag‘
when convert(datetime,@strJahr + ‚-12-26‘, 120) = @FuerDatum then ‚Stefanitag‘
when convert(datetime,@strJahr + ‚-12-31‘, 120) = @FuerDatum then ‚Silvester‘

else @RetWert
end
end

return @RetWert
end

Rechnen mit Arbeitstagen

Diese Funktion addiert zu einem Datum eine Anzahl von Arbeitstagen ohne Feiertage zu berücksichtigen (nur Wochenende).

ALTER FUNCTION [dbo].[AddBusinessDays] (@Date date,@n INT)
RETURNS DATE AS BEGIN
DECLARE @d INT;
SET @d=4-SIGN(@n)*(4-DATEPART(DW,@Date));
RETURN DATEADD(D,@n+((ABS(@n)+@d-2)/5)*2*SIGN(@n)-@d/7,@Date)
END

Hinterlasse einen Kommentar