Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Holen Sie sich einen bestimmten Wochentag innerhalb einer Woche, der durch eine DATETIME gegeben ist

Bei datetime-Werten müssen Sie sehr vorsichtig sein! Besonders der Index eines Tages ist knifflig. Sie sollten immer an kulturspezifische Unterschiede denken:

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

--Ich versuche das mit der deutschen Kultur, das fängt mit Montag an

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

--Jetzt dasselbe mit der englischen Kultur, beginnend am Sonntag

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

--Sie können diese Kultur unabhängig machen, indem Sie diese Werte mit Modulo 7 hinzufügen

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

Jetzt geben beide Abfragen den gleichen Wert für Freitag zurück, die 6 .

Ihr Beispiel zeigt den Sonntag als ersten Wochentag, also sollte der Sonntag der Woche zum angegebenen Tag eigentlich der 17. Juli sein. Ihre erwartete Ausgabe (24. Juli) ist der erste Tag der folgenden Woche, nicht wahr?

Versuchen Sie Folgendes:

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)