【问题标题】:Pull data from the third week back from this week? [duplicate]从本周拉回第三周的数据? [复制]
【发布时间】:2021-04-06 06:44:28
【问题描述】:

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

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

【问题讨论】:

  • 这需要针对一周的开始和/或一天的开始进行调整,还是我们要在同一时间返回 21 天?
  • 在一个新的查询窗口中,运行这个查询 "SELECT DATEADD(week, -3, GETDATE())" 它返回什么?除非您有与确切日期和时间相匹配的数据,否则您不会得到任何结果...
  • 试试这个方法。由于列 date 可能与当前时间戳不匹配。因此,请尝试单独与 Date 进行比较 WHERE CAST([date] AS DATE)= CAST(DATEADD(week, -3, GETDATE()) AS DATE)
  • 这能回答你的问题吗? sql query to get content older than 3 weeks
  • dup 获取超过 3 周的内容,此问题要求提供正好 3 周前的内容。

标签: sql sql-server date tsql dateadd


【解决方案1】:

我更喜欢以下:

  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))
Now Start Of Week (Inc) End Of Week (Ex)
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, dateadd(week, -3, current_timestamp)))
and [Date] < convert(date,dateadd(day, (-1*datepart(weekday,current_timestamp))+1, dateadd(week, -2, current_timestamp)))
Now Start Of Week (Inc) End Of Week (Ex)
2020-12-29 20:07:16.373 2020-12-06 2020-12-13

【讨论】:

    【解决方案2】:

    这只会为您提供日期为三周前的数据,从当前时间到最接近的千分之一秒。您几乎不可能有任何与此完全匹配的数据。

    我希望你在寻找的是三到两周前的数据,可以这样获得:

    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;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-22
      • 2021-09-29
      • 2011-10-21
      • 2011-10-08
      • 2020-01-22
      相关资源
      最近更新 更多