【问题标题】:How to find the past 4 weeks of the same weekday value starting today如何从今天开始查找过去 4 周的相同工作日值
【发布时间】:2019-07-10 21:36:25
【问题描述】:

我正在尝试从今天和过去 4 周内每周的同一天选择记录。

  1. 今天(星期二)
  2. 上周二
  3. 在那之前的那个星期二
  4. 在那之前的那个星期二

我需要将其绑定到当前日期,因为我将每天运行此查询,所以我不想使用介于或手动指定日期范围的东西。

到目前为止,我发现或尝试的所有内容都提取了最后一个月的数据,但没有提取同一工作日的最后 4 周。

select *
from table
where thedatecolumn >= DATEADD(mm, -1, GETDATE())

这可行,但会提取上个月的所有内容。

如果今天的日期是7/10/2019 我需要

Data from 7/10/2019
Data from 7/3/2019
Data from 6/26/2019
Data from 6/19/2019

我每天都会运行这个查询,所以我需要它基于当前日期是动态的。

【问题讨论】:

  • "Today (Tuesday)" 今天是星期三/星期四(取决于你的地理位置,但没有 UTC -21 是星期二),你也是总是在星期二的数据之后,不管它实际上是哪一天?
  • 获取今天的午夜,然后在午夜和 {midnight + 23h59m59s} 之间使用。在 {midnight-7d} 和 {midnight-7d + 23h59m59s} 之间添加。以此类推剩余的几周。
  • @ŁukaszNojek - 由于值小于一秒,因此存在超出该范围的值。对于给定的日期 + 1,您需要给定的日期 >= 和
  • 没错,这只是对有限评论空间的简化。感谢您的澄清。

标签: sql-server date


【解决方案1】:

我相信您想回顾 21 天,然后过滤那些具有相同星期几的日期:

select * from table
where thedatecolumn >= DATEADD(DAY, -21, CAST(GETDATE() AS DATE))
    and DATEPART(WEEKDAY, thedatecolumn) = DATEPART(WEEKDAY, GETDATE())

【讨论】:

  • @data_stephen 在我意识到您只需要一周中同一天的四个日期后,我编辑了我的答案。
  • 这非常简单。非常感谢!
  • 据我所知,在列上使用函数会阻止您使用索引。对于大表,您可能会观察到此查询的低性能。当性能相关时,最好避免使用此类解决方案。
  • @Lukasz 我相信你会发现 21 天的下限是完全可预测的。
【解决方案2】:

您可以尝试使用从今天开始并反复减去 7 天的递归 cte - 这样您就可以确保始终在同一个工作日登陆。举个例子:

WITH cteFromToday AS(
 SELECT 0 AS WeeksBack, GETDATE() AS MyDate
 UNION ALL
 SELECT WeeksBack + 1 AS WeeksBack, DATEADD(d, -7, MyDate) AS MyDate
   FROM cteFromToday
)
SELECT TOP 5 *
  FROM cteFromToday
  OPTION ( MaxRecursion 0 );

【讨论】:

    【解决方案3】:

    这很简单。将CURRENT_TIMESTAMP 替换为此处的任何给定日期。

    SELECT CONVERT(DATE,CURRENT_TIMESTAMP) AS Today, 
    DATEADD(DAY,-7,CONVERT(DATE,CURRENT_TIMESTAMP)) AS LastWeek ,
    DATEADD(DAY,-14,CONVERT(DATE,CURRENT_TIMESTAMP)) AS TwoWeeksAgo, 
    DATEADD(DAY,-21,CONVERT(DATE,CURRENT_TIMESTAMP)) AS ThreeWeeksAgo
    

    所以,如果您想获取包含这些日期的一整天的一组范围的数据:

    SELECT something
    WHERE
    datetimecolumn >= CONVERT(DATE,CURRENT_TIMESTAMP) AND datetimecolumn < DATEADD(DAY,1, CONVERT(DATE,CURRENT_TIMESTAMP)) -- Todays range, 
    OR datetimecolumn >= DATEADD(DAY,-7,CONVERT(DATE,CURRENT_TIMESTAMP)) AND datetimecolumn < DATEADD(DAY,1,DATEADD(DAY,-7,CONVERT(DATE,CURRENT_TIMESTAMP)))-- LastWeek ,
    OR datetimecolumn >= DATEADD(DAY,-14,CONVERT(DATE,CURRENT_TIMESTAMP)) AND datetimecolumn < DATEADD(DAY,1,DATEADD(DAY,-14,CONVERT(DATE,CURRENT_TIMESTAMP)))-- TwoWeeksAgo, 
    OR datetimecolumn >= DATEADD(DAY,-21,CONVERT(DATE,CURRENT_TIMESTAMP)) AND datetimecolumn < DATEADD(DAY,1, DATEADD(DAY,-21,CONVERT(DATE,CURRENT_TIMESTAMP))) -- ThreeWeeksAgo
    

    【讨论】:

    • 马克,非常感谢。这将在 shawnt00 返回完全相同的结果,但由于我将其包含在更大的查询中,因此我仍然可能需要 2 个选项来说明如何执行此操作。非常感谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多