特定の日を返す関数
SQL Server 2008、月の特定の日を返す関数
これは、1 つのスクリプトを使用して特定の日 (最後の日曜日や第 1 平日など) に実行されるコードを追加できるため、保守計画に役立ちました。ジョブが実行される時間を予測するためにも使用しました。私たちのサーバー。
この関数は、関心のある月、タイプ、および数値の 3 つの入力のみを必要とします。
Microsoft が毎月のジョブ スケジュールに使用する情報と同様の情報を使用します。
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
機能
取得した値は sysschedules テーブルに似ていますが、ここにリストします。
@タイプ
- 1=日曜日
- 2=月曜日
- 3=火曜日
- 4=水曜日
- 5=木曜日
- 6=金曜日
- 7=土曜日
- 8 = カウンターまでの任意の日または月の最終日
- 9 = カウンターまでの平日または月の最終日
- 10 = カウンタまたは月の最後の発生までの任意の土曜日または日曜日
@カウンター
- 1=1位
- 2=2位
- 3=3位
- 4=4位
- 32=最後 (これらは少し異なります)
手順は次のとおりです。
- 入力日を月の最初の日に設定する
- 月のループの変数を宣言します
- 各日付をループし、一致する場合は一致数を更新し、最後の一致を保持するために一時的な日付を更新します
- 一致がカウンターと同じで、カウンターが 5 未満 (5 = 最終日) の場合は、返却日を一時的な日付として設定します。日付が null ではなくなるため、ループが終了します。
- 現在の日付に 1 を追加し、チェックを再度実行します。
- 日付を返します。null の場合は、最後に一致した一時的な日付を返します。
以下は使用例です。 2月の毎週日曜日に開催されます。
これを IF 句で使用して、ストアド プロシージャの特定の部分を実行するかどうかを決定できます。
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
参考文献
これがあなたの役に立てば幸いです。または、他のプロセスのアイデアが得られることを願っています。
休日を計算する必要がある場合は、カレンダー テーブルが必要になります。以下のリンクで素晴らしい例を確認できます。