Funktion zur Rückgabe eines bestimmten Tages des Monats
Dies war für unseren Wartungsplan nützlich, da wir ein Skript verwenden und Code hinzufügen können, der an einem bestimmten Tag ausgeführt wird (wie dem letzten Sonntag oder dem ersten Wochentag). Ich habe es auch verwendet, um die Zeiten vorherzusagen, zu denen Jobs ausgeführt werden unsere Server.
Die Funktion erfordert nur drei Eingaben, den Monat, an dem Sie interessiert sind, den Typ und die Nummer.
Es verwendet ähnliche Informationen wie Microsoft für monatliche Auftragspläne.
SQL
CREATE FUNCTION dbo.GetMonthDay(@Month DATETIME,@Type INT, @Counter INT) RETURNS DATETIME AS BEGINSET @Month = CONVERT(DATE,DATEADD(DAY,1-DATEPART(DAY,@Month),@Month))DECLARE @CurDate DATETIME=@Month,@Date DATETIME,@Matches INT=0,@TempDate DATETIMEWHILE @CurDate 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 (CASE WHEN DATEPART(WeekDay,@CurDate) IN (1,7) THEN 1 ELSE 0 END)ELSE 0 END))=1 BEGINSET @Matches = @Matches+1SET @TempDate = @CurDateENDIF @Matches=@Counter AND @Counter<32 BEGINSET @Date=@TempDateENDSET @CurDate=DATEADD(DAY,1,@CurDate)ENDRETURN ISNULL(@Date,@TempDate)ENDGO
Was es macht
Die Werte, die wir haben, ähneln denen der sysschedules-Tabelle, aber ich werde sie hier auflisten;
@Typ
- 1=Sonntag
- 2=Montag
- 3=Dienstag
- 4=Mittwoch
- 5=Donnerstag
- 6=Freitag
- 7=Samstag
- 8=beliebiger Tag bis zum Zähler oder letzter Tag des Monats
- 9=beliebiger Wochentag bis zum Zähler oder Monatsletzter
- 10=jeder Samstag oder Sonntag bis zum Zählerstand oder dem letzten Vorkommen des Monats
@Zähler
- 1=1
- 2=2
- 3=3
- 4=4
- 32=Letzte (diese sind etwas anders)
Die folgenden Schritte sind wie folgt;
- Stellen Sie das Eingabedatum auf den ersten Tag des Monats ein
- Deklarieren Sie Variablen für unsere Schleife durch den Monat
- Durchlaufen Sie jedes Datum und aktualisieren Sie die Anzahl der Übereinstimmungen, wenn es eine Übereinstimmung gibt, und aktualisieren Sie ein temporäres Datum, um die letzte Übereinstimmung zu halten
- Wenn die Übereinstimmungen unserem Zähler entsprechen und der Zähler kleiner als 5 ist (5 = letzter Tag), dann setzen Sie unser Rückkehrdatum als temporäres Datum, dies beendet die Schleife, da das Datum nicht mehr null ist.
- Fügen Sie eins zu unserem aktuellen Datum hinzu und führen Sie unsere Überprüfung erneut durch.
- Geben Sie unser Datum zurück oder, falls null, das temporäre Datum, das unsere letzte Übereinstimmung war.
Unten ist ein Beispiel für die Verwendung. Dieser läuft jeden Sonntag im Februar.
Sie können es in einer IF-Klausel verwenden, um zu bestimmen, ob bestimmte Teile einer gespeicherten Prozedur ausgeführt werden sollen oder nicht.
Testing
SELECT Utilities.dbo.GetMonthDay('2020-02-11',1,1) --2020-02-02 00:00:00.000SELECT Utilities.dbo.GetMonthDay('2020-02-11',1,2) --2020-02-09 00:00:00.000SELECT Utilities.dbo.GetMonthDay('2020-02-11',1,3) --2020-02-16 00:00:00.000SELECT Utilities.dbo.GetMonthDay('2020-02-11',1,4) --2020-02-23 00:00:00.000SELECT Utilities.dbo.GetMonthDay('2020-02-11',1,32)--2020-02-23 00:00:00.000IF Utilities.dbo.GetMonthDay('2020-02-11',1,32)='2020-02-23' BEGINSELECT 'Run your code'END
Weiterlesen
Ich hoffe, dass dies für Sie von Nutzen sein kann oder Ihnen eine Idee für andere Prozesse gibt.
Wenn Sie mit Feiertagen rechnen müssen, benötigen Sie eine Kalendertabelle, und Sie können ein großartiges Beispiel unter dem folgenden Link sehen.