首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL NOW() 函數與 TIMESTAMP 欄位類型深度解析

     編輯:MySQL 資料庫相關知識

背景:MySQL 不支援欄位 DEFAULT 為函數

若需某欄位預設為當前日期時間,可使用 TIMESTAMP 欄位類型自動實現。

TIMESTAMP 顯示格式與儲存特性

關鍵規則:

  • 定義長度 0 或 >14 強制為 14
  • 1~13 奇數長度強制為下一個偶數
  • 所有 TIMESTAMP 實際儲存 14 位完整精度,顯示時才按定義截斷
  • 非法日期儲存為 0(00000000000000)

自動更新規則

資料表中第一個 TIMESTAMP 欄位在以下情況自動更新為當前時間:

  1. INSERT / LOAD DATA INFILE 未明確指定該欄位值
  2. UPDATE 未明確指定該欄位且其他欄位值實際改變
  3. 明確設定該欄位為 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
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
欄位定義顯示格式範例
TIMESTAMP(14)YYYYMMDDHHMMSS20021114093723
TIMESTAMP(12)YYMMDDHHMMSS021114093723
TIMESTAMP(10)YYMMDDHHMM0211140937
TIMESTAMP(8)YYYYMMDD20021114
TIMESTAMP(6)YYMMDD021114
TIMESTAMP(4)YYMM0211
TIMESTAMP(2)YY02