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

Get certain weekday within a week given by a DATETIME

我需要通过一个 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

有什么想法吗?

对于日期时间值,您必须非常小心!特别是一天的索引是棘手的。您应该始终考虑特定于文化的差异:

--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

--您可以通过将这些值与模 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

现在两个查询 return 相同的星期五值,即 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)