首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

MySQL 日期時間類型深度解析:DATE、DATETIME 與 TIMESTAMP 的異同

     編輯:MySQL 綜合教學

前言

在 MySQL 資料庫中,處理日期與時間是常見需求。DATE、DATETIME 與 TIMESTAMP 三種類型雖然相關,但各有特性與適用場景。本文將詳細比較它們的儲存範圍、顯示格式、自動更新行為以及相互轉換時的注意事項,幫助你選擇最適合的類型。

一、類型特性速覽

類型用途顯示格式支援範圍儲存大小
DATE僅需日期,無時間部分YYYY-MM-DD1000-01-01 至 9999-12-313 位元組
DATETIME同時需要日期與時間YYYY-MM-DD HH:MM:SS1000-01-01 00:00:00 至 9999-12-31 23:59:598 位元組
TIMESTAMP自動記錄建立/更新時間視顯示寬度而定(如 YYYYMMDDHHMMSS)1970-01-01 00:00:01 UTC 至 2038-01-19 03:14:07 UTC4 位元組

二、DATETIME 與 DATE 詳細說明

DATETIME

適用於需要完整時間戳記的場景。MySQL 以 YYYY-MM-DD HH:MM:SS 格式檢索並顯示。範圍極廣,適合歷史資料或未來長遠規劃。

DATE

僅儲存日期,忽略時間。顯示格式為 YYYY-MM-DD。若只關心年月日(如生日、入職日),使用 DATE 可節省空間。

三、TIMESTAMP 獨特行為

自動更新機制

TIMESTAMP 最大特色是可自動標記 INSERT 或 UPDATE 操作的當前日期時間。預設只有第一個 TIMESTAMP 欄位具備自動更新特性,觸發條件包括:

  • INSERT/LOAD DATA INFILE 未明確指定該欄位值
  • UPDATE 未指定該欄位且其他欄位值實際改變
  • 明確將欄位設為 NULL

其他 TIMESTAMP 欄位若需自動更新,需在 INSERT/UPDATE 時明確設為 NULL 或 NOW()。

顯示寬度與儲存

TIMESTAMP 可指定顯示寬度(如 TIMESTAMP(14)、TIMESTAMP(8)),但實際儲存永遠是 14 位元完整精度。寬度只影響顯示,不影響儲存。若使用 ALTER TABLE 擴大寬度,先前「隱藏」的時分秒將重現;縮小寬度則不會遺失資料,僅顯示較少資訊。

範圍限制

TIMESTAMP 範圍限於 1970 年至 2038 年(32 位元有號整數上限)。超出此範圍的日期(如 1968-01-01)若存入 TIMESTAMP 會變成「零值」(00000000000000)。DATETIME 與 DATE 則無此限制。

四、日期時間值的輸入格式

MySQL 接受多種字串與數字格式,具有「寬鬆」語法:

  • 含分隔符字串:'YYYY-MM-DD HH:MM:SS'、'YY-MM-DD HH:MM:SS',分隔符可為任意標點(如 .、/、@、^)。
  • 無分隔符字串:'YYYYMMDDHHMMSS'、'YYMMDDHHMMSS',長度決定解析方式(8/14 字元視為 4 位年,6/12 字元視為 2 位年)。
  • 數字格式:YYYYMMDDHHMMSS、YYMMDDHHMMSS 等,同樣依長度判斷。
  • 函數:NOW()、CURRENT_DATE 等。

非法值會轉換為對應類型的「零值」('0000-00-00 00:00:00'、'0000-00-00' 或 00000000000000)。

五、類型間賦值與轉換規則

  • DATE → DATETIME/TIMESTAMP:時間部分補 00:00:00。
  • DATETIME/TIMESTAMP → DATE:時間部分被捨棄。
  • 跨類型賦值時:若值超出目標類型範圍(如 1968 年存入 TIMESTAMP),會轉為零值。

六、常見陷阱與最佳實踐

  1. 兩位數年份解讀:00-69 → 2000-2069;70-99 → 1970-1999。建議一律使用四位數年份。
  2. 字串格式陷阱:'10:11:12' 會被解析為 2010-11-12(視為年月日),而非時間。'10:45:15' 則因月份 45 不合法而變零值。
  3. TIMESTAMP 函數限制:直接操作儲存值僅 UNIX_TIMESTAMP();HOUR()、SECOND() 等函數需顯示寬度包含對應部分才能正確運作。
  4. 選型建議:
    • 需完整時間且跨世紀 → DATETIME
    • 僅需日期 → DATE
    • 自動記錄建立/修改時間且範圍在 1970-2038 → TIMESTAMP(首欄自動更新)

七、總結

理解三者差異、範圍限制與自動更新行為,能避免資料截斷、零值錯誤及時區困擾。實務上,若應用涉及歷史資料或超出 2038 年,優先選 DATETIME;單純記錄建立/更新時間且確定在範圍內,TIMESTAMP 更便利;僅需日期則用 DATE 節省空間。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved