2016-07-26 5 views
2

Ich muss eine DateTime und DayOfWeek übergeben und davon muss ich DateTime der ausgewählten Woche erhalten.Gewinnt einen bestimmten Wochentag innerhalb einer Woche durch ein DATETIME

--Sunday-1 
--Monday-2 
--Tuesday-3 
--Wednesday-4 
--Thursday-5 
--Friday-6 
--Saturday-7 

DECLARE @DayOfWeek TINYINT = 1 
DECLARE @Date DATETIME = '2016-07-21 23:47:11.133' 
SELECT DATEADD(wk, DATEDIFF(wk,0,@Date), @DayOfWeek) 

für zB:

für diese, ich brauche Datum wie 2016-07-24 00:00:00 zu erhalten, die Sunday auf dieser Woche.

Irgendwelche Ideen?

+0

ich Ihre Frage Titel geändert und versucht, sie setzen mehr * auf den Punkt *, überprüfen Sie bitte dieses! – Shnugo

Antwort

2

Mit Datetime-Werten müssen Sie sehr vorsichtig sein! Vor allem der Index eines Tages ist schwierig. Sie sollten denken an kulturspezifische Unterschiede immer:

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

--I versuchen, dies mit der deutschen Kultur, beginnt diese mit Montag

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

--Jetzt das gleiche mit der englischen Kultur, beginnt am Sonntag

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

kann --Sie diese Kultur unabhängige erhalten, indem diese Werte mit Modulo Zugabe von 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 

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

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

Try this:

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) 
Verwandte Themen