获取 DATETIME 给出的一周内的某个工作日
Get certain weekday within a week given by a DATETIME
我需要通过一个 DateTime
和 DayOfWeek
,然后我需要从中获得所选周的 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)
我需要通过一个 DateTime
和 DayOfWeek
,然后我需要从中获得所选周的 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)