日時の値では、非常に注意する必要があります。特に一日のインデックスはトリッキーです。文化固有の違いを常に考える必要があります:
--The first of January was a Friday in 2016
DECLARE @testDate DATE = {d'2016-01-01'};
-私はこれをドイツの文化で試します。これは月曜日から始まります
SET LANGUAGE GERMAN;
SELECT @@DATEFIRST,DATEPART(WEEKDAY,@testDate); --in Germany the Friday was 5th day
-日曜日から始まる英国の文化も同じです
SET LANGUAGE ENGLISH;
SELECT @@DATEFIRST,DATEPART(WEEKDAY,@testDate); --in English culture this is the 6th day
--Modulo 7でこれらの値を追加することにより、この文化に依存しないようにすることができます
SET LANGUAGE GERMAN;
SELECT (@@DATEFIRST + DATEPART(WEEKDAY,@testDate)) % 7; --in Germany the Friday was 5th day
SET LANGUAGE ENGLISH;
SELECT (@@DATEFIRST + DATEPART(WEEKDAY,@testDate)) % 7; --in English culture this is the 6th day
これで、両方のクエリが金曜日に同じ値、6
を返します。 。
あなたの例では、日曜日を週の最初の日として示しているため、特定の日の曜日は実際には7月17日である必要があります。期待される出力(7月24日)は翌週の初日ですね。
これを試してください:
DECLARE @DayOfWeek TINYINT = 1;
DECLARE @Date DATETIME = '2016-07-21 23:47:11.133';
SELECT CAST(@Date + @DayOfWeek - (@@DATEFIRST + DATEPART(WEEKDAY,@Date)) % 7 AS DATE)