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