Mit Datetime-Werten müssen Sie sehr vorsichtig sein! Vor allem der Index eines Tages ist schwierig. Sie sollten denken an kulturspezifische Unterschiede immer:
--The first of January was a Friday in 2016
DECLARE @testDate DATE = {d'2016-01-01'};
--I versuchen, dies mit der deutschen Kultur, beginnt diese mit Montag
SET LANGUAGE GERMAN;
SELECT @@DATEFIRST,DATEPART(WEEKDAY,@testDate); --in Germany the Friday was 5th day
--Jetzt das gleiche mit der englischen Kultur, beginnt am Sonntag
SET LANGUAGE ENGLISH;
SELECT @@DATEFIRST,DATEPART(WEEKDAY,@testDate); --in English culture this is the 6th day
kann --Sie diese Kultur unabhängige erhalten, indem diese Werte mit Modulo Zugabe von 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
Jetzt geben beide Abfragen den gleichen Wert für Freitag, die 6
.
Ihr Beispiel zeigt den Sonntag als ersten Tag der Woche, also sollte der Sonntag der Woche bis zum angegebenen Tag eigentlich der 17. Juli sein. Ihre erwartete Ausgabe (24. Juli) ist der erste Tag der folgenden Woche, oder?
Try this:
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)
ich Ihre Frage Titel geändert und versucht, sie setzen mehr * auf den Punkt *, überprüfen Sie bitte dieses! – Shnugo