Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Obtenir un certain jour de la semaine dans une semaine donné par un DATETIME

Avec les valeurs datetime, vous devez être très prudent ! Surtout l'indice d'un jour est délicat. Vous devez toujours penser aux différences spécifiques à la culture :

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

--J'essaie ça avec la culture allemande, ça commence par lundi

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

--Maintenant la même chose avec la culture anglaise, à partir du dimanche

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

--Vous pouvez rendre cette culture indépendante en ajoutant ces valeurs avec 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

Maintenant, les deux requêtes renvoient la même valeur pour vendredi, le 6 .

Votre exemple montre le dimanche comme premier jour de la semaine, donc le dimanche de la semaine au jour donné devrait être le 17 juillet en fait. Votre sortie prévue (24 juillet) est le premier jour de la semaine suivante, n'est-ce pas ?

Essayez ceci :

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)