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 DATETIME
和 TIMESTAMP
的差異
DATETIME
和 TIMESTAMP
具有相似的功能,但存在以下主要差異:
- 時區影響:
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_time
的 DATETIME
欄位。
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 何時使用 DATETIME
或 TIMESTAMP
- 何時使用
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
是管理日期和時間數據的強大工具,適合用於存儲不受時區影響的時間資訊,如活動開始時間或預約時間。
理解 DATETIME
和 TIMESTAMP
的適用場景,並遵循正確的數據存儲方式,將有助於確保數據庫的準確性和效率。此外,透過適當的時區管理,開發者可以更好地應對全球不同時區的需求。
8. 常見問題 (FAQ)
Q1: DATETIME
和 TIMESTAMP
的主要區別是什麼?
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
。