1) あなたのソリューションは、非決定論的な関数を使用しています: datepart(dw...)
. このため、設定を変更DATEFIRST
すると異なる結果が得られます。たとえば、次のことを試してください。
SET DATEFIRST 7;
your solution;
その後
SET DATEFIRST 1;
your solution;
DATEFIRST
2) 以下のソリューションは/LANGUAGE
設定とは無関係です:
DECLARE @NextDayID INT = 0 -- 0=Mon, 1=Tue, 2 = Wed, ..., 5=Sat, 6=Sun
SELECT DATEADD(DAY, (DATEDIFF(DAY, @NextDayID, GETDATE()) / 7) * 7 + 7, @NextDayID) AS NextDay
結果:
NextDay
-----------------------
2013-09-23 00:00:00.000
DATETIME
このソリューションは、次のタイプのプロパティに基づいています。
0 日目 = 19000101
= 月
1日目 = 19000102
= 火
2日目 = 19000103
= 水曜日
...
5日目 = 19000106
= 土
6日目 = 19000107
= 日
したがって、INT 値 0 を DATETIME に変換すると、 が得られ19000101
ます。
次を見つけたい場合は、 2 日目 ( / )Wednesday
から開始し、2日目と現在の日 ( ; 41534 日) の間の日数を計算し、7 で割ります (完全な週数を取得するため; 5933 週)、複数7 (41531 fays; 日数 - 最初の /と最後の間の 1 週間)を取得し、7 日 (1 週間; 41538 日; 次を取得するために) を追加します。この数 (41538 日) を開始日に追加します: 。19000103
Wed
20130921
Wednesday
19000103
Wednesday
Wednesday
19000103
注: 現在の日付は20130921
です。
編集#1:
DECLARE @NextDayID INT;
SET @NextDayID = 1; -- Next Sunday
SELECT DATEADD(DAY, (DATEDIFF(DAY, ((@NextDayID + 5) % 7), GETDATE()) / 7) * 7 + 7, ((@NextDayID + 5) % 7)) AS NextDay
結果:
NextDay
-----------------------
2013-09-29 00:00:00.000
注: 現在の日付は20130923
です。