Med datetime-værdier skal du være meget forsigtig! Især indekset for en dag er vanskelig. Du bør altid tænke på kulturspecifikke forskelle:
--The first of January was a Friday in 2016
DECLARE @testDate DATE = {d'2016-01-01'};
--Jeg prøver det her med tysk kultur, det starter med mandag
SET LANGUAGE GERMAN;
SELECT @@DATEFIRST,DATEPART(WEEKDAY,@testDate); --in Germany the Friday was 5th day
--Nu det samme med engelsk kultur, startende på søndag
SET LANGUAGE ENGLISH;
SELECT @@DATEFIRST,DATEPART(WEEKDAY,@testDate); --in English culture this is the 6th day
--Du kan få denne kultur uafhængig ved at tilføje disse værdier 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 returnerer begge forespørgsler den samme værdi for fredag, 6
.
Dit eksempel viser søndagen som den første dag i ugen, så søndagen i ugen til den givne dag burde faktisk være den 17. juli. Dit forventede output (24. juli) er den første dag i den følgende uge, ikke?
Prøv dette:
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)