MySQL 的 DATETIME 完全指南

1. MySQL 的 DATETIME 是什麼?

MySQL 的 DATETIME 是用於同時處理日期和時間的資料型態。在資料庫中管理日期時間對於記錄日誌、預約系統等各種應用程式至關重要。DATETIME 型態允許將日期與時間存儲在同一個欄位中,並能夠保存廣泛的數值範圍。其範圍從 '1000-01-01 00:00:00''9999-12-31 23:59:59',並支援小數秒。

2. MySQL 日期時間資料型態概覽

2.1 可用來處理日期和時間的資料型態

MySQL 提供以下資料型態來處理日期與時間:

  • DATE: 只包含年、月、日的資料型態。範圍為 '1000-01-01''9999-12-31'
  • TIME: 只包含時間的資料型態。範圍為 '-838:59:59''838:59:59'
  • DATETIME: 同時包含日期和時間的資料型態。範圍為 '1000-01-01 00:00:00''9999-12-31 23:59:59'
  • TIMESTAMP: 存儲 UNIX 時間戳記的資料型態。範圍為 '1970-01-01 00:00:01''2038-01-19 03:14:07'

2.2 DATETIMETIMESTAMP 的差異

DATETIMETIMESTAMP 具有相似的功能,但存在以下主要差異:

  • 時區影響: DATETIME 儲存固定值,不受時區影響。而 TIMESTAMP 儲存時會轉換為 UTC,在擷取時會根據伺服器的當前時區轉換回來。因此,DATETIME 適用於與時區無關的日期時間(如活動時間),而 TIMESTAMP 適合用於伺服器記錄等與時區相關的資料。
  • 存儲格式: DATETIME 以原始格式儲存,而 TIMESTAMP 以 UNIX 時間戳記儲存。因此,TIMESTAMP 會受到伺服器時區設定的影響,而 DATETIME 則不會。

3. MySQL 中 DATETIME 的使用方法

3.1 建立 DATETIME 欄位

要建立 DATETIME 欄位,可以使用以下 SQL 語法:

CREATE TABLE sample_table (
    event_time DATETIME
);

在這個範例中,我們在 sample_table 資料表中建立了一個名為 event_timeDATETIME 欄位。

3.2 插入 DATETIME

MySQL 的 DATETIME 值可以使用多種格式插入。最基本的格式是 'YYYY-MM-DD HH:MM:SS',例如:

INSERT INTO sample_table (event_time) VALUES ('2024-09-16 14:30:00');

此外,MySQL 也允許以下格式:

  • 'YY-MM-DD HH:MM:SS': 年份使用兩位數字表示。
  • 'YYYYMMDDHHMMSS': 省略分隔符號的格式。

範例:

INSERT INTO sample_table (event_time) VALUES ('24-09-16 14:30:00');
INSERT INTO sample_table (event_time) VALUES (20240916143000);

這些格式的值將會被正確地存儲。在兩位數年份格式中,'70-99' 會被解釋為 1970-1999,而 '00-69' 則會被解釋為 2000-2069

3.3 擷取 DATETIME

當擷取 DATETIME 值時,MySQL 預設會以 'YYYY-MM-DD HH:MM:SS' 格式顯示。例如:

SELECT event_time FROM sample_table;

這個查詢會以標準格式顯示資料表中 DATETIME 欄位的值。

4. 處理小數秒

4.1 DATETIME 的精度

MySQL 支援在 DATETIME 值中存儲小數秒。透過 fsp(fractional seconds precision)參數可以指定精度,範圍為 0 到 6。例如,要建立一個能夠存儲 3 位小數秒的欄位:

CREATE TABLE precise_times (
    event_time DATETIME(3)
);

這個範例中,event_time 欄位可存儲最多 3 位小數秒。

4.2 插入含小數秒的值

要插入帶有小數秒的 DATETIME 值,可以使用以下 SQL 語法:

INSERT INTO precise_times (event_time) VALUES ('2024-09-16 14:30:00.123');

這樣的查詢能夠準確存儲小數秒部分,並在查詢時保留精度。

5. DATETIME 的最佳實踐

5.1 何時使用 DATETIMETIMESTAMP

  • 何時使用 DATETIME: 適用於不受時區影響的固定時間,例如活動開始時間、預約時間。
  • 何時使用 TIMESTAMP: 適用於與伺服器時區相關的時間數據,例如資料的建立時間、更新時間。

5.2 時區管理

DATETIME 沒有時區資訊,因此應用程式需要自行管理時區轉換。而 TIMESTAMP 會自動根據伺服器的時區來轉換,因此適合用於全球不同時區的應用。

6. 常見錯誤與避免方法

6.1 零日期與無效值

在 MySQL 中,如果試圖插入無效的 DATETIME 值,系統可能會存儲為 '0000-00-00 00:00:00'(零日期)。由於這並不是一個有效的日期,建議在插入數據時進行驗證,以防止無效數據的存入。例如,可以使用檢查條件來確保輸入的數據符合有效的時間範圍。

6.2 精度錯誤

當指定 DATETIME 的小數秒精度時,使用不適當的精度值可能會導致存儲錯誤。例如,如果您的應用程式不需要小數秒,則應避免為 DATETIME 欄位指定 fsp 值,以減少存儲空間的浪費。當需要小數秒時,請確保 fsp 值與應用程式需求一致。例如,若應用只需要毫秒精度(3 位數),則 DATETIME(3) 是適當的選擇。

7. 總結

本篇文章詳細介紹了 MySQL DATETIME 資料型態的特性與用法,包括與 TIMESTAMP 的區別、如何存儲和查詢 DATETIME 值、小數秒的處理方式,以及最佳實踐與常見錯誤的避免方法。DATETIME 是管理日期和時間數據的強大工具,適合用於存儲不受時區影響的時間資訊,如活動開始時間或預約時間。

理解 DATETIMETIMESTAMP 的適用場景,並遵循正確的數據存儲方式,將有助於確保數據庫的準確性和效率。此外,透過適當的時區管理,開發者可以更好地應對全球不同時區的需求。

8. 常見問題 (FAQ)

Q1: DATETIMETIMESTAMP 的主要區別是什麼?

DATETIME 會存儲固定時間值,不受時區影響,適用於如預約日期、事件時間等。而 TIMESTAMP 會自動轉換為 UTC 存儲,並在查詢時根據伺服器的時區轉換回來,適用於日誌記錄等需要跨時區管理的數據。

Q2: 如何在 DATETIME 欄位中存儲小數秒?

當建立 DATETIME 欄位時,可以指定 fsp(小數秒精度)來存儲小數秒。例如:

CREATE TABLE precise_times (
    event_time DATETIME(3)
);

此設定允許存儲 3 位小數秒的 DATETIME 值,例如:

INSERT INTO precise_times (event_time) VALUES ('2024-09-16 14:30:00.123');

Q3: 我應該使用 DATETIME 還是 TIMESTAMP

如果您的應用需要存儲與時區無關的固定時間(如會議開始時間),應使用 DATETIME。如果需要記錄事件發生時間且會根據伺服器時區轉換(如日誌記錄),則應使用 TIMESTAMP