我无法使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天)计数
答案 0 :(得分:0)
这是您的问题:
DATEADD(day, 8-datepart(DW, GETDATE()), CONVERT(DATE,GETDATE())))
您正在将数据库中的DATETIME
与TIME
与没有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