将第三周的数据从本周恢复



本周是20年12月28日的一周。我想从第三周的数据中提取当前周的数据。因此,如果我今天运行查询,我希望它只提取12/7周的数据。我正在尝试这样做,但没有返回任何结果。有什么想法吗?谢谢

WHERE date = DATEADD(week, -3, GETDATE())

我更喜欢以下内容:

  1. 允许您在不调用Date列上的函数的情况下使用该列。这对于可用性非常重要,即SQL Server能够在Date列上使用索引。尽管在我测试castdate时仍然使用了索引,但它的最佳实践是避免函数调用where子句中的列。

  2. 避免使用between,我总是需要花点时间来思考,因为它的>=是第一个条件,<=是第二个条件。因此,很容易把逻辑搞错,包括8天而不是7天。相反,我总是使用显式比较,所以逻辑是显而易见的

现在请注意>=<,而不是<=

where [Date] >= convert(date,dateadd(week, -3, current_timestamp))
and [Date] < convert(date,dateadd(week, -2, current_timestamp))
周结束(Ex(
现在周开始(Inc(
2020年12月29日20:07:16.3732020-12-082020-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;

相关内容

  • 没有找到相关文章

最新更新