Dengan nilai datetime Anda harus sangat berhati-hati! Terutama indeks hari itu rumit. Anda harus selalu memikirkan perbedaan budaya tertentu:
--The first of January was a Friday in 2016
DECLARE @testDate DATE = {d'2016-01-01'};
--Saya mencoba ini dengan budaya Jerman, ini dimulai dengan Senin
SET LANGUAGE GERMAN;
SELECT @@DATEFIRST,DATEPART(WEEKDAY,@testDate); --in Germany the Friday was 5th day
--Sekarang sama dengan budaya Inggris, mulai hari Minggu
SET LANGUAGE ENGLISH;
SELECT @@DATEFIRST,DATEPART(WEEKDAY,@testDate); --in English culture this is the 6th day
--Anda bisa mendapatkan budaya ini independen dengan menambahkan nilai-nilai tersebut dengan 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
Sekarang kedua kueri mengembalikan nilai yang sama untuk hari Jumat, 6
.
Contoh Anda menunjukkan hari Minggu sebagai hari pertama dalam seminggu, jadi hari Minggu dalam seminggu hingga hari tertentu seharusnya tanggal 17 Juli. Hasil yang Anda harapkan (24 Juli) adalah hari pertama minggu berikutnya, bukan?
Coba ini:
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)