Med datetime-värden måste du vara mycket försiktig! Särskilt indexet för en dag är knepigt. Du bör alltid tänka på kulturspecifika skillnader:
--The first of January was a Friday in 2016
DECLARE @testDate DATE = {d'2016-01-01'};
--Jag provar det här med tysk kultur, det här börjar med måndag
SET LANGUAGE GERMAN;
SELECT @@DATEFIRST,DATEPART(WEEKDAY,@testDate); --in Germany the Friday was 5th day
--Nu samma sak med engelsk kultur, med start på söndag
SET LANGUAGE ENGLISH;
SELECT @@DATEFIRST,DATEPART(WEEKDAY,@testDate); --in English culture this is the 6th day
--Du kan få den här kulturen oberoende genom att lägga till dessa värden med 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
Nu returnerar båda frågorna samma värde för Friday, 6
.
Ditt exempel visar söndagen som första dagen i veckan, så söndagen i veckan till den givna dagen borde faktiskt vara den 17 juli. Din förväntade produktion (24 juli) är den första dagen i följande vecka, eller hur?
Prova detta:
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)