| 欄位定義 | 顯示格式 | 範例 |
| TIMESTAMP(14) | YYYYMMDDHHMMSS | 20021114093723 |
| TIMESTAMP(12) | YYMMDDHHMMSS | 021114093723 |
| TIMESTAMP(10) | YYMMDDHHMM | 0211140937 |
| TIMESTAMP(8) | YYYYMMDD | 20021114 |
| TIMESTAMP(6) | YYMMDD | 021114 |
| TIMESTAMP(4) | YYMM | 0211 |
| TIMESTAMP(2) | YY | 02 |
關鍵規則:
- 定義長度 0 或 >14 強制為 14
- 1~13 奇數長度強制為下一個偶數
- 所有 TIMESTAMP 實際儲存 14 位完整精度,顯示時才按定義截斷
- 非法日期儲存為 0(
00000000000000)
自動更新規則
資料表中第一個 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 變 0
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
- 兩位數年份:00-69 → 2000-2069,70-99 → 1970-1999
- 上一篇文章: MySQL ERROR 1005 (errno: 150) 外鍵建立失敗:原因分析與兩大經典案例
- 下一篇文章: MySQL 5.0 預處理語句:PREPARE/EXECUTE 實現動態 SQL 與防注入
Copyright ©
程式碼之家 All Rights Reserved