【发布时间】:2018-06-22 12:23:59
【问题描述】:
我无法让 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天)
【问题讨论】:
-
当你输出的所有东西都很重要时,我不清楚你是如何确定它在做什么的。是什么让您对它的工作原理得出目前的结论?一些样本数据和预期结果也可能极大地改善这一点。
-
您好!我是如何得出结论的,实际上是在 2 个数字不匹配的日期之间在 sql 中进行计数。当我从周一到周日数数时,我也数了前一周的周日数,数字突然匹配了。
-
只是好奇为什么要将 GETDATE() 转换为 DATE 以便在 DATEADD 中使用它。我认为不需要转换。
-
@MishMish - 但由于您的查询根本没有输出任何周数,您如何知道查询中的哪些计数对应于任何特定周?
标签: sql-server date