查找最近 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 找到了多達三行。想想為什麼上次是一根線,這次是三根?