Avec les valeurs datetime, vous devez être très prudent ! Surtout l'indice d'un jour est délicat. Vous devez toujours penser aux différences spécifiques à la culture :
--The first of January was a Friday in 2016
DECLARE @testDate DATE = {d'2016-01-01'};
--J'essaie ça avec la culture allemande, ça commence par lundi
SET LANGUAGE GERMAN;
SELECT @@DATEFIRST,DATEPART(WEEKDAY,@testDate); --in Germany the Friday was 5th day
--Maintenant la même chose avec la culture anglaise, à partir du dimanche
SET LANGUAGE ENGLISH;
SELECT @@DATEFIRST,DATEPART(WEEKDAY,@testDate); --in English culture this is the 6th day
--Vous pouvez rendre cette culture indépendante en ajoutant ces valeurs avec 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
Maintenant, les deux requêtes renvoient la même valeur pour vendredi, le 6
.
Votre exemple montre le dimanche comme premier jour de la semaine, donc le dimanche de la semaine au jour donné devrait être le 17 juillet en fait. Votre sortie prévue (24 juillet) est le premier jour de la semaine suivante, n'est-ce pas ?
Essayez ceci :
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)