Met datetime-waarden moet je heel voorzichtig zijn! Vooral de index van een dag is lastig. Je moet altijd denken aan cultuurspecifieke verschillen:
--The first of January was a Friday in 2016
DECLARE @testDate DATE = {d'2016-01-01'};
--Ik probeer dit met de Duitse cultuur, dit begint met maandag
SET LANGUAGE GERMAN;
SELECT @@DATEFIRST,DATEPART(WEEKDAY,@testDate); --in Germany the Friday was 5th day
--Nu hetzelfde met de Engelse cultuur, beginnend op zondag
SET LANGUAGE ENGLISH;
SELECT @@DATEFIRST,DATEPART(WEEKDAY,@testDate); --in English culture this is the 6th day
--Je kunt deze cultuur onafhankelijk krijgen door die waarden toe te voegen met 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 retourneren beide zoekopdrachten dezelfde waarde voor vrijdag, de 6
.
Uw voorbeeld toont de zondag als eerste dag van de week, dus de zondag van de week tot de gegeven dag zou eigenlijk 17 juli moeten zijn. Je verwachte output (24 juli) is de eerste dag van de volgende week, nietwaar?
Probeer dit:
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)