Bei datetime-Werten müssen Sie sehr vorsichtig sein! Besonders der Index eines Tages ist knifflig. Sie sollten immer an kulturspezifische Unterschiede denken:
--The first of January was a Friday in 2016
DECLARE @testDate DATE = {d'2016-01-01'};
--Ich versuche das mit der deutschen Kultur, das fängt mit Montag an
SET LANGUAGE GERMAN;
SELECT @@DATEFIRST,DATEPART(WEEKDAY,@testDate); --in Germany the Friday was 5th day
--Jetzt dasselbe mit der englischen Kultur, beginnend am Sonntag
SET LANGUAGE ENGLISH;
SELECT @@DATEFIRST,DATEPART(WEEKDAY,@testDate); --in English culture this is the 6th day
--Sie können diese Kultur unabhängig machen, indem Sie diese Werte mit Modulo 7 hinzufügen
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
Jetzt geben beide Abfragen den gleichen Wert für Freitag zurück, die 6
.
Ihr Beispiel zeigt den Sonntag als ersten Wochentag, also sollte der Sonntag der Woche zum angegebenen Tag eigentlich der 17. Juli sein. Ihre erwartete Ausgabe (24. Juli) ist der erste Tag der folgenden Woche, nicht wahr?
Versuchen Sie Folgendes:
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)