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