Z wartościami datetime musisz być bardzo ostrożny! Szczególnie indeks dnia jest trudny. Zawsze powinieneś myśleć o różnicach specyficznych dla kultury:
--The first of January was a Friday in 2016
DECLARE @testDate DATE = {d'2016-01-01'};
--Próbuję tego z kulturą niemiecką, zaczyna się od poniedziałku
SET LANGUAGE GERMAN;
SELECT @@DATEFIRST,DATEPART(WEEKDAY,@testDate); --in Germany the Friday was 5th day
--Teraz to samo z kulturą angielską, począwszy od niedzieli
SET LANGUAGE ENGLISH;
SELECT @@DATEFIRST,DATEPART(WEEKDAY,@testDate); --in English culture this is the 6th day
--Możesz uzyskać niezależność tej kultury, dodając te wartości za pomocą 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
Teraz oba zapytania zwracają tę samą wartość dla piątku, 6
.
Twój przykład pokazuje niedzielę jako pierwszy dzień tygodnia, więc niedziela tygodnia do danego dnia powinna być w rzeczywistości 17 lipca. Twój oczekiwany wynik (24 lipca) to pierwszy dzień następnego tygodnia, prawda?
Spróbuj tego:
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)