2016-07-26 3 views
2

Мне нужно передать один DateTime и DayOfWeek, и из этого мне нужно получить DateTime этой недели.Получите определенный будний день в течение недели, заданный 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) 

для например:

для этого, мне нужно получить дату, как 2016-07-24 00:00:00, который Sunday на этой неделе.

Любые идеи?

+0

Я изменил название вашего вопроса, пытаясь поставить его более * к точке *, пожалуйста, проверьте это! – Shnugo

ответ

2

С значениями даты и времени вы должны быть очень осторожны! Особенно индекс дня сложный. Вы всегда должны думать о культуре специфических различий:

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

--Я попробовать это с немецкой культурой, это начинается с понедельника

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

--Now же с английской культурой, начиная с воскресенья

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

--ВЫ могут получить эту культуру независимы путем добавления этих значений 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 

Теперь оба запроса возвращают то же значение для пятницы, 6.

Ваш пример показывает воскресенье как первый день недели, поэтому на воскресенье недели до данного дня должно быть 17 июля. Ваш ожидаемый результат (24 июля) - это первый день следующей недели, не так ли?

Попробуйте это:

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) 

 Смежные вопросы

  • Нет связанных вопросов^_^