查找最近 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 找到了多达三行。想想为什么上次是一根线,这次是三根?
GO TO FULL VERSION