Navicat 部落格

在 MySQL 中處理日期和時間 - 第 5 部分 2022 年 4 月 1 日,由 Robert Gravelle 撰寫

根據日期查詢

在 MySQL 中的日期和時間系列的最後一部分中,我們將透過撰寫 SELECT 查詢來取得資料中與日期相關的細節,從而將迄今為止所學到的一切付諸實踐。

從 Datetime 欄中選取日期

資料庫從業者在嘗試查詢日期時遇到的首要挑戰之一是大量時序資料儲存為 DateTime 和 Timestamp 資料類型。例如,Sakila 範例資料庫將 customer 資料表的 create_date 欄儲存為 Datetime:

datetime_column (51K)

因此,如果我們試圖選取在特定日期建立的客戶記錄,就不能只提供日期值:

compare_date_to_datetime (29K)

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

select_date_from_datetime (129K)

現在,任何符合日期的記錄都將被傳回。

取得兩個日期之間的差異

執行査詢以確定事件發生的時間是非常常見的。在MySQL中,實現這一點的方法是使用 DATEDIFF() 函式。它接受兩個日期值並傳回它們之間的天數。下面是一個使用 Navicat for MySQL 16 的簡單範例:

datediff (27K)

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

datediff_past (26K)

計算天數以外的時間段

對於天數以外的時間段,我們需要做一些轉換。例如,我們可以除以 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() 函式來計算在歸還電影之前客戶租借電影的平均天數:

average rental length in days query (90K)

為此,將 DATEDIFF() 函式的結果傳遞給 AVG() 函式,然後四捨五入到小數點後 1 位。

系列總結

在本系列中,我們涵蓋了很多關於日期和時間的內容,包括:

  • MySQL 的五種時序資料類型
  • 一些重要的日期或時間導向的函式
  • 如何在 MySQL 中建立日期和時間
  • 根據日期查詢

雖然在 MySQL 中處理時序資料肯定還有很多工作要做,但希望本系列能讓你在學習 MySQL 的道路上有個很好的開端。

Navicat 文章
頻道記錄
分享
部落格封存檔