Con i valori datetime devi stare molto attento! Soprattutto l'indice di un giorno è complicato. Dovresti sempre pensare alle differenze culturali specifiche:
--The first of January was a Friday in 2016
DECLARE @testDate DATE = {d'2016-01-01'};
--Ci provo con la cultura tedesca, inizia con lunedì
SET LANGUAGE GERMAN;
SELECT @@DATEFIRST,DATEPART(WEEKDAY,@testDate); --in Germany the Friday was 5th day
--Ora lo stesso con la cultura inglese, a partire da domenica
SET LANGUAGE ENGLISH;
SELECT @@DATEFIRST,DATEPART(WEEKDAY,@testDate); --in English culture this is the 6th day
--Puoi ottenere questa cultura indipendente aggiungendo quei valori con 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
Ora entrambe le query restituiscono lo stesso valore per Friday, il 6
.
Il tuo esempio mostra la domenica come primo giorno della settimana, quindi la domenica della settimana per il giorno specificato dovrebbe essere effettivamente il 17 luglio. L'output previsto (24 luglio) è il primo giorno della settimana successiva, vero?
Prova questo:
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)