Funktion, um den bestimmten Tag des Monats zurückzugeben
Dies war für unseren Wartungsplan nützlich, da wir ein Skript verwenden und Code hinzufügen können, der an einem bestimmten Tag läuft (wie der letzte Sonntag oder der 1. Wochentag), habe ich ihn auch für die Vorhersage der Zeiten verwendet, auf denen Jobs läuft Unsere Server.
Die Funktion benötigt nur drei Eingänge, den Monat, den Sie interessieren, den Typ und die Nummer.
Es verwendet ähnliche Informationen wie Microsoft für monatliche Job-Zeitpläne verwenden.
SQL
ALTER FUNCTION FirstDay(@Month DATETIME,@Type INT, @Counter INT) RETURNS DATETIME
AS BEGIN
SET @Month = CONVERT(DATE,DATEADD(DAY,1-DATEPART(DAY,@Month),@Month))
DECLARE @CurDate DATETIME=@Month,@Date DATETIME,@Matches INT=0,@TempDate DATETIME
WHILE @CurDate<DATEADD(MONTH,1,@Month) AND @Date IS NULL BEGIN
IF (SELECT (CASE @Type WHEN 1 THEN (CASE WHEN DATEPART(WeekDay,@CurDate)=1 THEN 1 ELSE 0 END)
WHEN 2 THEN(CASE WHEN DATEPART(WeekDay,@CurDate)=2 THEN 1 ELSE 0 END)
WHEN 3 THEN(CASE WHEN DATEPART(WeekDay,@CurDate)=3 THEN 1 ELSE 0 END)
WHEN 4 THEN(CASE WHEN DATEPART(WeekDay,@CurDate)=4 THEN 1 ELSE 0 END)
WHEN 5 THEN(CASE WHEN DATEPART(WeekDay,@CurDate)=5 THEN 1 ELSE 0 END)
WHEN 6 THEN(CASE WHEN DATEPART(WeekDay,@CurDate)=6 THEN 1 ELSE 0 END)
WHEN 7 THEN(CASE WHEN DATEPART(WeekDay,@CurDate)=7 THEN 1 ELSE 0 END)
WHEN 8 THEN(CASE WHEN DATEPART(WeekDay,@CurDate) IN (1,2,3,4,5,6,7) THEN 1 ELSE 0 END)
WHEN 9 THEN(CASE WHEN DATEPART(WeekDay,@CurDate) IN (2,3,4,5,6) THEN 1 ELSE 0 END)
WHEN 10 THEN (CASEWHEN DATEPART(WeekDay,@CurDate) IN (1,7) THEN 1 ELSE 0 END)
ELSE 0 END))=1 BEGIN
SET @Matches = @Matches+1
SET @TempDate = @CurDate
END
IF @Matches=@Counter AND @Counter<32 BEGIN
SET @Date=@TempDate
END
SET @CurDate=DATEADD(DAY,1,@CurDate)
END
RETURN ISNULL(@Date,@TempDate)
END
GO
Für @Type. 1 = Sonntag, 2 = Montag, 3 = Dienstag, 4 = Mittwoch, 5 = Donnerstag, 6 = Freitag, 7 = Samstag
Für @Counter, 1 = 1., 2 = 2nd, 3 = 3rd, 4 = 4th etc ..., 32 = Last (diese sind etwas anders)
Die folgenden Schritte sind wie folgt:
- Setzen Sie das Eingabedatum auf den ersten Tag des Monats
- Deklariere Variablen für unsere Schleife durch den Monat
- Loop durch jedes Datum und aktualisieren Match-Count, wenn es eine Übereinstimmung, und aktualisieren Sie ein temporäres Datum, um die letzte Übereinstimmung zu halten
- Wenn die Übereinstimmungen gleich unserem Zähler sind und der Zähler weniger als 5 (5 = letzter Tag) ist, dann setzen wir unser Rückgabedatum als das Tempeldatum, das wird dann die Schleife verlassen, da das Datum nicht mehr Null ist.
- Fügen Sie ein zu unserem aktuellen Datum hinzu und führen Sie unseren Scheck erneut durch.
- Rückkehr unser Datum, oder wenn null das Temp-Datum, das war unser letztes Spiel war.
Unten ist ein Beispiel dafür, wo es zum Beispiel unsere Wartungspläne hinzugefügt werden könnte. Das läuft am letzten Sonntag im Monat.
SQL
--Run your code here...
END