S hodnotami data a času musíte být velmi opatrní! Zejména index dne je složitý. Vždy byste měli myslet na kulturní rozdíly:
--The first of January was a Friday in 2016
DECLARE @testDate DATE = {d'2016-01-01'};
--Zkouším to s německou kulturou, začíná to v pondělí
SET LANGUAGE GERMAN;
SELECT @@DATEFIRST,DATEPART(WEEKDAY,@testDate); --in Germany the Friday was 5th day
--Nyní to samé s anglickou kulturou, od neděle
SET LANGUAGE ENGLISH;
SELECT @@DATEFIRST,DATEPART(WEEKDAY,@testDate); --in English culture this is the 6th day
--Tuto kulturu můžete získat nezávislou přidáním těchto hodnot pomocí 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
Nyní oba dotazy vracejí stejnou hodnotu pro pátek, 6
.
Váš příklad ukazuje neděli jako první den v týdnu, takže neděle v týdnu k danému dni by měla být ve skutečnosti 17. července. Váš očekávaný výstup (24. července) je první den následujícího týdne, že?
Zkuste toto:
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)