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

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

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

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

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

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

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