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 IntegerDeclare @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 DatetimeDeclare @SA as integer
Declare @SO as integerDeclare @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
endset @M = case
when @Jahr between 1700 and 1899 then 23
when @Jahr between 1900 and 2199 then 24
else 0
endset @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
endset @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
endset @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
endreturn @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