在DATETIME给出的一周内获得某个工作日

时间:2016-07-26 23:11:39

标签: sql-server sql-server-2008 tsql datetime dayofweek

我需要传递一个DateTimeDayOfWeek,然后我需要获得所选周的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

任何想法?

1 个答案:

答案 0 :(得分: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

- 与英国文化相同,从星期日开始

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

您的示例将星期日显示为一周的第一天,因此本周日到达给定日期应该是7月17日。你的预期产出(7月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)