MySQL 不支援欄位 DEFAULT 為函數(如 NOW()),若需自動記錄建立/更新時間,TIMESTAMP 是首選方案。
| 列類型 | 顯示格式 |
|---|---|
| TIMESTAMP(14) | YYYYMMDDHHMMSS |
| TIMESTAMP(12) | YYMMDDHHMMSS |
| TIMESTAMP(10) | YYMMDDHHMM |
| TIMESTAMP(8) | YYYYMMDD |
| TIMESTAMP(6) | YYMMDD |
| TIMESTAMP(4) | YYMM |
| TIMESTAMP(2) | YY |
關鍵規則:
00000000000000。TIMESTAMP(8) 實際仍存完整年月日時分秒;ALTER TABLE 擴寬欄位時,隱藏的時分秒會顯現。UNIX_TIMESTAMP();若格式化結果不含時分秒,HOUR()、SECOND() 等函數會產生不可預期結果。僅第一個 TIMESTAMP 欄位具備自動更新特性,觸發條件:
INSERT/LOAD DATA INFILE 未明確指定該欄值。UPDATE 未指定該欄且其他欄位值真正改變(設為原值不觸發)。NULL。非第一個 TIMESTAMP 欲自動更新,需明確設為 NULL 或 NOW()。
CREATE TABLE test (
id INT(3) UNSIGNED AUTO_INCREMENT,
date1 TIMESTAMP(14),
date2 TIMESTAMP(14),
PRIMARY KEY(id)
);
INSERT INTO test (id, date1, date2) VALUES (1, NULL, NULL); -- 兩欄皆為當前時間
INSERT INTO test SET id=2; -- date1=當前時間, date2=0000...
UPDATE test SET id=3 WHERE id=1; -- date1 更新, date2 不變
UPDATE test SET id=1, date1=date1, date2=NOW() WHERE id=3; -- date1 不變, date2 更新
使用 DATE_FORMAT() 將數字格式轉為可讀日期:
SELECT id,
DATE_FORMAT(date1, '%Y-%m-%d %H:%i:%s') AS date1,
DATE_FORMAT(date2, '%Y-%m-%d %H:%i:%s') AS date2
FROM test;
日期類型轉換注意:
DATE → DATETIME/TIMESTAMP:時間部份補 00:00:00。DATETIME/TIMESTAMP → DATE:時間部份被截斷。TIMESTAMP 範圍限 1970~2037,超出範圍會變為 0。字串指定日期陷阱:'10:11:12' 在日期語境下會被解析為 2010-11-12;兩位數年份 00-69 對應 2000-2069,70-99 對應 1970-1999。