【问题标题】:SET DATEFIST = 1 not working correctlySET DATEFIST = 1 无法正常工作
【发布时间】: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


【解决方案1】:

这是你的问题:

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

您将数据库中的DATETIMETIME 与没有TIMEDATE 进行比较。因此,下周一的 DATE 部分将相等,您的

这不起作用,因为 DB 字段是 DATETIME,而您正在与 DATE 进行比较。

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 

返回 2

如果您确实想包含周日之前的所有内容,则需要将截止时间设置为周一上午 12:00:00。一种方法是:

DATEADD(DAY,0,DATEDIFF(DAY,0,dateadd(day, 8-datepart(dw, getdate()),getdate())))

【讨论】:

  • 您好,我根据您的建议编辑了我的答案。但它仍然从星期日(前一周)到星期日(后一周)计算
  • 我打赌你需要在日期比较的两端都这样做。您还可以在此处使用@Date BETWEEN LowDate AND HighDate 构造。
猜你喜欢
  • 1970-01-01
  • 2021-06-17
  • 2019-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-19
  • 2018-06-08
  • 2022-07-14
相关资源
最近更新 更多