SQL在过去四周内获取数据

时间:2018-01-24 14:15:57

标签: sql date dbeaver

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

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周(周一到周日)获取数据?

P.S我正在使用DBeaver。 谢谢。

1 个答案:

答案 0 :(得分: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)

发生了什么:

您可以找到Date and Time Functions Here。在此查询中,我们使用:

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

    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
    )
    

    工作案例Scenario