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

标签 sql-server sql-server-2008 t-sql 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 的日期,即该周的星期日

有什么想法吗?

最佳答案

对于日期时间值,您必须非常小心!尤其是一天的指数是很棘手的。您应该始终考虑文化的具体差异:

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

关于sql-server - 获取 DATETIME 给出的一周内的某个工作日,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38601313/

相关文章:

php - PHP-mssql-mssql_get_last_message()返回空字符串

sql - SSMS:常用查询列表

database - 如何使用 hql 将日期格式化为 "YYYY-mm-dd"格式?

t-sql - 在SQL Server 2000中,如何删除没有主键的表中的指定行?

sql-server - 带有方括号终止的 JSON 对象的 JSON_VALUE

c# - 如果没有匹配项,则获取第一个单个匹配元素或第一个?

c++ - srv_paramsetoutput() 可以用来设置 nvarchar(max) 或 varchar(max) 吗?

jquery - SQL Server : assign value for character and get average value for each user

sql - T-SQL 结果写入列

c# - 使用 SQL Server、EF6 保存静态列表的最佳方法