Sql server 在SQL中查询本周的所有项目

Sql server 在SQL中查询本周的所有项目,sql-server,datetime,Sql Server,Datetime,我有一个查询,选择给定星期的所有项目,并将其日期设置为该星期的开始日期。在某些情况下,查询为给定项设置了一个不正确的日期值,我已经跟踪到问题出在DATEDIFF或DATEADD函数中 问题是 SELECT DATEADD(WEEK, DATEDIFF(WEEK, 0, DateTimeValue), 0) AS NewDateTimeValue 让我们以2016年3月27日为例。DATEDIFF返回值6065,带有该值的DATEADD返回2016年3月28日 对于2016年3月26日的日期,D

我有一个查询,选择给定星期的所有项目,并将其日期设置为该星期的开始日期。在某些情况下,查询为给定项设置了一个不正确的日期值,我已经跟踪到问题出在DATEDIFF或DATEADD函数中

问题是

SELECT DATEADD(WEEK, DATEDIFF(WEEK, 0, DateTimeValue), 0) AS NewDateTimeValue
让我们以2016年3月27日为例。DATEDIFF返回值6065,带有该值的DATEADD返回2016年3月28日

对于2016年3月26日的日期,DATEDIFF返回6064,DATEADD返回2016年3月21日

对我来说,这听起来像是一个星期的第一天问题,SQL Server认为星期天是一周的第一天,因此星期天和星期六的值不同(2016年3月27日是星期天)

我试着把一周的第一天定在

SET DATEFIRST 1
但这并没有任何区别,SQL返回了相同的结果


那么,是什么导致SQL函数的行为如此,以及如何修复它呢?

我发现DATEDIFF不尊重DATEFIRST设置,总是假设一周从周日开始。这就是我的示例案例能够正常工作的原因。此问题有一些建议的解决方法:

发生这种情况是因为您正在查找从日期0到提供日期的周数。0实际上是“1900-01-01”,这是一个星期一。因此,
DATEDIFF
查找从该日期到提供的数据的已完成周数。这就是为什么2016年3月27日的
DATEDIFF
返回6065(因为它是一周的结束),2016年3月26日返回6064(因为它仍然不是一周的结束)

这一点已经在本链接中解释过了-

一个简单的解决方法是提供两个日期:开始日期和结束日期。