С значениями даты и времени вы должны быть очень осторожны! Особенно индекс дня сложный. Вы всегда должны думать о культуре специфических различий:
--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
--Now же с английской культурой, начиная с воскресенья
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
.
Ваш пример показывает воскресенье как первый день недели, поэтому на воскресенье недели до данного дня должно быть 17 июля. Ваш ожидаемый результат (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)
Я изменил название вашего вопроса, пытаясь поставить его более * к точке *, пожалуйста, проверьте это! – Shnugo