Със стойностите за дата и час трябва да сте много внимателни! Особено индексът на ден е труден. Винаги трябва да мислите за специфичните за културата различия:
--The first of January was a Friday in 2016
DECLARE @testDate DATE = {d'2016-01-01'};
--Опитвам това с немската култура, това започва от понеделник
SET LANGUAGE GERMAN;
SELECT @@DATEFIRST,DATEPART(WEEKDAY,@testDate); --in Germany the Friday was 5th day
--Сега същото с английската култура, започвайки от неделя
SET LANGUAGE ENGLISH;
SELECT @@DATEFIRST,DATEPART(WEEKDAY,@testDate); --in English culture this is the 6th day
--Можете да направите тази култура независима, като добавите тези стойности с 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
Сега и двете заявки връщат една и съща стойност за петък, 6
.
Вашият пример показва неделята като първи ден от седмицата, така че неделята от седмицата до дадения ден трябва да бъде всъщност 17 юли. Вашият очакван резултат (24 юли) е първият ден на следващата седмица, нали?
Опитайте това:
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)