SET DATEFIST = 1无法正常工作

时间:2018-06-22 12:24:00

标签: sql-server date

我无法使SET DATEFIRST能够正确处理当前正在处理的一些简单查询。

这是我的第一个示例:

SET DATEFIRST = 1
SELECT count(Distinct ID)
FROM Products
WHERE
Location in (12) 
and YEAR (CREATED) = '2018'
Group by datepart(wk, created), year(created) 

上面的代码给我一些正确的结果,而另一些错误。基本上是从星期一到星期一,但是我希望从星期一到星期日。我仍然不明白为什么要计算8天而不是几周的7天。

我还有SET DATEFIRST = 1的多个选择,这也行不通:

SET DATEFIRST = 1
--Products finished this week  
SELECT count(Distinct ID)
FROM Products
WHERE
Created >= dateadd(day, 1-datepart(dw, getdate()), CONVERT(date,getdate())) 
AND Created <  dateadd(day, 8-datepart(dw, getdate()), CONVERT(date,getdate()))
AND Location in (15,16,17) AND (Location IS NOT NULL OR Location NOT IN(18))
UNION ALL
--------------------------------------------
-- Products received this week
SELECT count(Distinct ID)
FROM Products
WHERE 
Created >= dateadd(day, 1-datepart(dw, getdate()), CONVERT(date,getdate())) 
AND Created <  DATEADD(DAY,0,DATEDIFF(DAY,0,dateadd(day, 8-datepart(dw, getdate()),getdate())))
AND Location in(1)

以上代码对SET DATEFIRST = 1无反应 它不是从星期一到星期日计数,而是从星期日到星期日(8天)计数

1 个答案:

答案 0 :(得分:0)

这是您的问题:

DATEADD(day, 8-datepart(DW, GETDATE()), CONVERT(DATE,GETDATE()))) 

您正在将数据库中的DATETIMETIME与没有DATE的{​​{1}}进行比较。因此,下周一的TIME部分将相等,并且您的<将失败。

这是行不通的,因为数据库字段是DATE,并且您正在与DATETIME进行比较。

DATE

返回2

如果您想在周日之前包括所有内容,则需要将截止时间设置为周一上午12:00:00 AM。一种方法是像这样:

SET @D= '06/25/2018 01:20:23 AM' --Monday next week with a time
IF(@D < DATEADD(day, 8-datepart(DW, GETDATE()), CONVERT(GETDATE()))) --<--The whole day 
    SELECT 1 -- '06/25/2018 12:00:23 AM' < (DATE)2018-06-25    
ELSE  
    SELECT 2