¡Con los valores de fecha y hora debes tener mucho cuidado! Especialmente el índice de un día es complicado. Siempre debe pensar en las diferencias culturales específicas:
--The first of January was a Friday in 2016
DECLARE @testDate DATE = {d'2016-01-01'};
--Intento esto con la cultura alemana, esto comienza con el lunes
SET LANGUAGE GERMAN;
SELECT @@DATEFIRST,DATEPART(WEEKDAY,@testDate); --in Germany the Friday was 5th day
--Ahora lo mismo con la cultura inglesa, a partir del domingo
SET LANGUAGE ENGLISH;
SELECT @@DATEFIRST,DATEPART(WEEKDAY,@testDate); --in English culture this is the 6th day
--Puede obtener esta cultura independiente agregando esos valores 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
Ahora ambas consultas devuelven el mismo valor para el viernes, el 6
.
Su ejemplo muestra el domingo como el primer día de la semana, por lo que el domingo de la semana del día dado debería ser el 17 de julio en realidad. Su salida esperada (24 de julio) es el primer día de la semana siguiente, ¿no es así?
Prueba esto:
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)