查找最近 30 天内的事件

另一个常见任务是搜索属于特定日期范围的行。原则上,如果范围的开始和结束日期是固定的,这并不困难:SQL 可以比较日期,也可以比较数字。

比较运算符可应用于日期:<><=等。此外,还有一种特殊的 BETWEEN 运算符也可用于日期。例如,让我们编写一个查询,从任务表中选择 2022 年夏季需要完成的所有任务。该请求将如下所示:

SELECT * FROM task  
WHERE task.deadline BETWEEN '2022-06-01' AND '2022-08-31'

此查询的结果将是:

ID emploee_id 姓名 最后期限
1个 1个 修复一个前端bug 2022-06-01
2个 2个 修复后端的一个bug 2022-06-15
3个 5个 买咖啡 2022-07-01
4个 5个 买咖啡 2022-08-01

但是,如果我们想获得任务,例如最近 30 天的任务,请在请求中写什么。最近 30 天与查询执行时间直接相关。也就是说,如果查询是在 7 月 25 日执行的,那么您需要选择 6 月 25 日到 7 月 24 日之间的日期。如何将日期范围绑定到当前时间?

为此,请使用日期添加功能:

DATE_ADD (date, INTERVAL expression units)

我认为用几个例子来解释会更容易:

# 要求 结果
1个 DATE_ADD('2022-06-04', 间隔 5 天) 2022-06-09
2个 DATE_ADD('2022-06-04', 间隔 4 周) 2022-07-02
3个 DATE_ADD('2022-06-04', 间隔 2 个月) 2022-08-04
4个
5个 DATE_SUB('2022-06-04',间隔 5 天) 2022-05-30
6个 DATE_SUB('2022-06-04',间隔 4 周) 2022-05-07
7 DATE_SUB('2022-06-04',间隔 2 个月) 2022-04-04

顺便说一句,也可以从某个日期中减去一定的天数、周数、月数和年数。

如果我们回到我们的请求——获取最近 30 天的数据,那么我们需要这个范围内的两个日期:

  • CURDATE() - 范围结束
  • DATE_SUB( CURDATE() , INTERVAL 30 DAY) - 范围开始

该请求将如下所示:

SELECT * FROM task WHERE task.deadline  
BETWEEN DATE_SUB( CURDATE() , INTERVAL 30 DAY) AND CURDATE() 

该查询的结果将是这样的(我今天是 2022 年 6 月 4 日):

ID emploee_id 姓名 最后期限
1个 1个 修复一个前端bug 2022-06-01

如何找出两个日期之间的差异

还有另一个有用的功能。有时您可能需要以天为单位计算两个日期之间的差异。为此,SQL 有一个特殊的函数——DATEDIFF()。

和她一起工作很容易:

DATEDIFF (date 1, date 2)

第二个日期只是从第一个日期中减去。如果 date2 在 date1 之后,则结果将为负数。

顺便说一下,我们可以使用 DATEDIFF() 函数重写之前的查询。我们需要从任务表中选择截止日期与当前日期相差不超过 30 天的所有任务。该请求如下所示:

SELECT * FROM task WHERE DATEDIFF(task.deadline, CURDATE() ) < 30

该查询的结果将是这样的(我今天是 2022 年 6 月 4 日):

ID emploee_id 姓名 最后期限
1个 1个 修复一个前端bug 2022-06-01
2个 2个 修复后端的一个bug 2022-06-15
3个 5个 买咖啡 2022-07-01

这一次,SQL 找到了多达三行。想想为什么上次是一根线,这次是三根?