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

MySQL 日期時間型別選擇指南:DATETIME vs TIMESTAMP vs DATE vs TIME vs YEAR 完整對比

     編輯:MySQL 綜合教學

五大型別核心屬性對比

型別儲存空間格式範圍零值
DATETIME8 bytesYYYY-MM-DD HH:MM:SS1000-01-01 00:00:00 ~ 9999-12-31 23:59:590000-00-00 00:00:00
TIMESTAMP4 bytesYYYY-MM-DD HH:MM:SS1970-01-01 08:00:01 ~ 2038-01-19 11:14:070000-00-00 00:00:00
DATE4 bytesYYYY-MM-DD1000-01-01 ~ 9999-12-310000-00-00
TIME3 bytesHH:MM:SS-838:59:59 ~ 838:59:5900:00:00
YEAR1 byteYYYY1901 ~ 2155 (4位)0000

型別選擇決策樹

需要「年月日 時分秒」完整時間點

  • 跨時區應用、國際化系統 → TIMESTAMP
    • 自動按會話時區轉換儲存/讀取
    • 不同地區用戶看到各自本地時間
    • 範圍限於 1970-2038(2038 年問題)
  • 歷史資料、未來長遠規劃、不需時區轉換 → DATETIME
    • 範圍極大(1000-9999 年)
    • 儲存即顯示,不受時區影響
    • 佔 8 bytes,較 TIMESTAMP 大 2 倍

僅需「年月日」

  • 生日、入職日期、訂單日期 → DATE(4 bytes,最精準)

僅需「時分秒」

  • 每日排班、營業時間、倒計時 → TIME(3 bytes,支援負值表時間差)

僅需「年份」

  • 出生年、統計年度 → YEAR(1 byte,極省空間)

TIMESTAMP 特殊行為詳解

  1. 時區轉換:寫入時轉為 UTC 儲存,讀出時轉為會話時區
  2. 第一個 TIMESTAMP 欄位自動屬性:
    • 預設值 = CURRENT_TIMESTAMP
    • 更新時自動刷新 = ON UPDATE CURRENT_TIMESTAMP
    • 可用 DEFAULT 0 或 DEFAULT CURRENT_TIMESTAMP 顯式控制
  3. 受 SQL_MODE 影響大:NO_ZERO_DATE、EXPLICIT_DEFAULTS_FOR_TIMESTAMP 等會改變預設行為

輸入格式寬容度(所有型別通用)

格式類型範例說明
字串標準'2014-06-18 14:54:10'間隔符任意:-, /, ., :, 空格
字串無分隔'20140618145410'14/12/8/6 位數字自動解析
數值格式20140618145410同字串無分隔,不加引號
兩位年份'14-06-18 14:54:10'00-69 → 2000-2069, 70-99 → 1970-1999

超出範圍處理

  • 預設 SQL_MODE:報錯 + 存零值
  • ALLOW_INVALID_DATES:允許存入無效日期(如 2014-02-30)

實務建議速查表

業務場景推薦型別理由
建立/更新時間戳記TIMESTAMP自動維護、時區感知
用戶生日、證件有效期DATE語義精確、無時區困擾
歷史事件、考古記錄DATETIME範圍涵蓋
每日固定排程時間TIME語義匹配
統計年份欄位YEAR1 byte 極致省空間
高頻寫入、大量資料TIMESTAMP4 bytes 節省空間、IO
需保留 2038 年後資料DATETIME避免 2038 年問題
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved