问题描述
本周是 12/28/20 的那一周。我想从当前周的第三周开始提取数据。因此,如果我今天运行查询,我希望它仅提取 12/7 周的数据。我正在尝试这样做,但没有返回任何结果。有任何想法吗?谢谢
WHERE date = DATEADD(week,-3,GETDATE())
解决方法
我更喜欢以下内容:
-
允许您在不调用函数的情况下使用
Date
列。这对于 sargability 即 SQL Server 在Date
列上使用索引的能力很重要。尽管在我测试cast
到date
时您仍然使用索引,但它的最佳做法是避免对where
子句中的列进行函数调用。 -
避免使用
between
,因为它的>=
是第一个条件,而<=
是第二个条件,所以我总是需要花点时间考虑一下。所以很容易弄错逻辑,包括 8 天而不是 7 天。相反,我总是使用显式比较,所以很明显逻辑是什么。
现在注意 >=
和 <
而不是 <=
。
where [Date] >= convert(date,dateadd(week,-3,current_timestamp))
and [Date] < convert(date,-2,current_timestamp))
现在 | 本周开始(公司) | 周末(前) |
---|---|---|
2020-12-29 20:07:16.373 | 2020-12-08 | 2020-12-15 |
如果您需要它在您的一周开始日开始,请使用:
where [Date] >= convert(date,dateadd(day,(-1*datepart(weekday,current_timestamp))+1,current_timestamp)))
and [Date] < convert(date,current_timestamp)))
现在 | 本周开始(公司) | 周末(前) |
---|---|---|
2020-12-29 20:07:16.373 | 2020-12-06 | 2020-12-13 |
这只会为您提供日期为三周前从当前时间到最近的千分之一秒的数据。您不太可能拥有与此完全匹配的任何数据。
我希望您追求的是三到两周前的数据,可以这样获取:
WHERE date BETWEEN DATEADD(week,GETDATE()) AND DATEADD(week,GETDATE())
但是,如果您在一天中运行一半,它只会为您提供三周前一天一半到两周前一天一半的数据。您可能希望在一天的开始和结束时从午夜开始。这可以通过将所有内容强制转换为 DATE 类型来完成,这具有丢弃时间的效果,如下所示:
WHERE CAST(date AS DATE) >= CAST(DATEADD(week,GETDATE()) AS DATE) AND CAST(date AS DATE) < CAST(DATEADD(week,GETDATE()) AS DATE)
您也有可能希望让周始终从一周的同一天开始。这可以使用 DATEPART 函数来完成。
WHERE DATEPART(week,date) = DATEPART(week,DATEADD(week,GETDATE())) AND DATEPART(year,date) = DATEPART(year,GETDATE()))
根据您想要什么以及您的数据库是如何设置的,最后一个选项可能需要设置 SET DATEFIRST 设置以获得正确的日期开始一周。例如在星期一开始一周使用:
SET DATEFIRST 1;