在 MySQL 中處理日期和時間(五)
第五章節(jié):如何在 SELECT 查詢中使用時態(tài)數據
在 MySQL 中的日期和時間系列的最后一部分中,我們將通過編寫 SELECT 查詢來將迄今為止學到的所有知識付諸實踐,以獲得對數據的與日期相關的細節(jié)。
從 Datetime 列中選擇日期
數據庫從業(yè)人員在嘗試查詢日期時遇到的首要挑戰(zhàn)之一是大量時間數據存儲為 DateTime 和 Timestamp 數據類型。例如,Sakila 示例數據庫將 customer 表的 create_date 列存儲為 Datetime:

因此,如果我們嘗試選擇在特定日期創(chuàng)建的客戶記錄,就不能只提供日期值:

一個簡單的解決方法是使用 DATE() 函數將 Datetime 值轉換為日期:

現在,任何匹配日期的記錄都將被返回。
獲取兩個日期之間的差異
執(zhí)行確定某件事發(fā)生多久之前的查詢是非常常見的。在 MySQL 中,這樣做的方法是使用 DATEDIFF() 函數。它接受兩個日期值并返回它們之間的天數。以下是一個簡單示例:

請注意,在上面的示例中,DATEDIFF() 讓我們知道第一個日期比第二個日期晚 10 天。第一個參數也可以使用更早的日期,它將返回一個負值:

計算天數以外的時間段
對于天數以外的時間段,我們需要做一些轉換。例如,我們可以除以 7 來獲得兩個日期之間的周數。使用舍入可以在結果中顯示整數周:
ROUND(DATEDIFF(end_date, start_date)/7, 0) AS weeksout
對于其他時間段,TIMESTAMPDIFF() 函數可能會有所幫助。它接受兩個 TIMESTAMP 或 DATETIME 值(DATE 值將在 MySQL 中自動轉換)以及我們想要差異的時間單位。例如,我們可以在第一個參數中指定 MONTH 作為單位:
SELECT TIMESTAMPDIFF(MONTH, '2012-05-05', '2012-06-04')
-- Outputs: 0
SELECT TIMESTAMPDIFF(MONTH, '2012-05-05', '2012-06-05')
-- Outputs: 1
SELECT TIMESTAMPDIFF(MONTH, '2012-05-05', '2012-06-15')
-- Outputs: 1
SELECT TIMESTAMPDIFF(MONTH, '2012-05-05', '2012-12-16')
-- Outputs: 7
一個更復雜的例子
一旦掌握了 DATEDIFF() 函數的竅門,就可以以更進階的方式使用它。舉個例子,這里有一個查詢,它使用 DATEDIFF() 函數來計算客戶在歸還電影之前租借的平均天數:

為此,將 DATEDIFF() 函數的結果傳遞給 AVG() 函數,然后四舍五入到小數點后 1 位。
系列總結
我們在這個日期和時間系列中涵蓋了很多內容,包括:
雖然在 MySQL 中處理時態(tài)數據肯定還有很多工作要做,但希望本系列能讓你在學習 MySQL 的道路上有個很好的開端。
推薦閱讀
(點擊標題可跳轉閱讀)
