0

我想获得过去四个星期的数据。现在,我通常在星期二运行查询,因此我有以下代码:

AND datatime between dateadd(day,-30,getdate()) and dateadd(day,-2,getdate())

我想随时运行查询(不仅仅是在星期二),还想获取同一时期的数据(从星期一到星期日的最后四个星期)。

我试图做以下事情

AND datatime between dateadd(week,-4,getdate()) and dateadd(week,-1,getdate())

但它不起作用,因为获得的数据不是来自前几周(周一到周日),而是来自我运行它之前的 7 天。

关于如何使用该结构获取数据的任何想法,以便我从前 4 周(周一至周日)获取数据,无论何时运行查询?

PS我正在使用DBeaver。谢谢你。

4

1 回答 1

0

如果你想要过去 4 周的第一个星期一到今天的所有数据,你可以使用这个:

AND datatime >= DATE_ADD(
         DATE_ADD(CURDATE(), INTERVAL - WEEKDAY(CURDATE()) DAY),
         INTERVAL - 4 WEEK)

但是,如果你想要从过去 4 周的第一个星期一到最后一个星期日的所有数据,你可以使用这个:

AND datatime >= DATE_ADD(
         DATE_ADD(CURDATE(), INTERVAL - WEEKDAY(CURDATE()) DAY),
         INTERVAL - 4 WEEK)
AND datatime < DATE_SUB(
         DATE(NOW()), INTERVAL DAYOFWEEK(NOW())-2 DAY)

发生了什么 :

您可以在此处找到日期和时间函数。在此查询中,我们使用:

  1. DATE_ADD(start, Interval) :将时间值(间隔)添加到日期值(开始),
  2. DATE_SUB(end, Interval) :从日期(结束)中减去时间值(间隔),
  3. CURDATE() :返回当前日期,
  4. WEEKDAY(date) :返回日期的工作日索引(0 = 星期一,1 = 星期二,... 6 = 星期日),
  5. DAYOFWEEK(date) :返回日期的工作日索引(1 = 星期日,2 = 星期一,...,7 = 星期六)

所以 :

DATE_ADD(
      DATE_ADD(----------------------------------------------------------
             CURDATE(),                                                 |
             INTERVAL - WEEKDAY(CURDATE()) DAY //<== Return Today Index |-> Will Return the date of this week's monday : (25-01-2018 - 3 DAY) = 22-01-2018
                                               (WEEKDAY(25-01-2018) = 3)|
      ),-----------------------------------------------------------------
      INTERVAL - 4 WEEK //<== Will go 4 weeks back and start from monday
)

一个工作案例场景

于 2018-01-24T14:55:28.757 回答