Với các giá trị datetime, bạn phải rất cẩn thận! Đặc biệt là chỉ số của một ngày là khó khăn. Bạn nên luôn nghĩ đến những khác biệt cụ thể về văn hóa:
--The first of January was a Friday in 2016
DECLARE @testDate DATE = {d'2016-01-01'};
--Tôi thử điều này với văn hóa Đức, điều này bắt đầu từ Thứ Hai
SET LANGUAGE GERMAN;
SELECT @@DATEFIRST,DATEPART(WEEKDAY,@testDate); --in Germany the Friday was 5th day
--Giống như vậy với văn hóa Anh, bắt đầu từ Chủ nhật
SET LANGUAGE ENGLISH;
SELECT @@DATEFIRST,DATEPART(WEEKDAY,@testDate); --in English culture this is the 6th day
--Bạn có thể có được nền văn hóa này một cách độc lập bằng cách thêm các giá trị đó với 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
Giờ đây, cả hai truy vấn đều trả về cùng một giá trị cho Thứ Sáu, 6
.
Ví dụ của bạn cho thấy Chủ nhật là ngày đầu tiên trong tuần, vì vậy Chủ nhật trong tuần của một ngày nhất định thực tế phải là ngày 17 tháng 7. Sản lượng dự kiến của bạn (ngày 24 tháng 7) là ngày đầu tiên của tuần sau, phải không?
Hãy thử điều này:
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)