Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Ottieni determinati giorni della settimana entro una settimana data da un DATETIME

Con i valori datetime devi stare molto attento! Soprattutto l'indice di un giorno è complicato. Dovresti sempre pensare alle differenze culturali specifiche:

--The first of January was a Friday in 2016
DECLARE @testDate DATE = {d'2016-01-01'};

--Ci provo con la cultura tedesca, inizia con lunedì

SET LANGUAGE GERMAN;
SELECT @@DATEFIRST,DATEPART(WEEKDAY,@testDate); --in Germany the Friday was 5th day

--Ora lo stesso con la cultura inglese, a partire da domenica

SET LANGUAGE ENGLISH;
SELECT @@DATEFIRST,DATEPART(WEEKDAY,@testDate); --in English culture this is the 6th day

--Puoi ottenere questa cultura indipendente aggiungendo quei valori con 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

Ora entrambe le query restituiscono lo stesso valore per Friday, il 6 .

Il tuo esempio mostra la domenica come primo giorno della settimana, quindi la domenica della settimana per il giorno specificato dovrebbe essere effettivamente il 17 luglio. L'output previsto (24 luglio) è il primo giorno della settimana successiva, vero?

Prova questo:

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)