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

MySQL 日期時間處理完全指南:函數、自動時間戳與實戰技巧

     編輯:MySQL 綜合教學

日期時間資料類型

類型範圍格式儲存空間
DATETIME1000-01-01 00:00:00 ~ 9999-12-31 23:59:59YYYY-MM-DD HH:MM:SS8 bytes
DATE1000-01-01 ~ 9999-12-31YYYY-MM-DD3 bytes
TIMESTAMP1970-01-01 00:00:01 UTC ~ 2038-01-19 03:14:07 UTCYYYY-MM-DD HH:MM:SS4 bytes
TIME-838:59:59 ~ 838:59:59HH:MM:SS3 bytes
YEAR1901 ~ 2155YYYY1 byte

MySQL 允許存儲「不嚴格合法」日期(如 1999-11-31),僅檢查月 0-12、日 0-31。應用層需自行驗證。

取得當前日期時間

函數回傳值字串語境格式數值語境格式
CURDATE() / CURRENT_DATE當前日期YYYY-MM-DDYYYYMMDD
CURTIME() / CURRENT_TIME當前時間HH:MM:SSHHMMSS
NOW() / SYSDATE() / CURRENT_TIMESTAMP當前日期時間YYYY-MM-DD HH:MM:SSYYYYMMDDHHMMSS
SELECT CURDATE();      -- 2024-05-20
SELECT CURDATE() + 0;  -- 20240520
SELECT NOW();          -- 2024-05-20 14:30:00

日期時間運算

  • DATE_ADD(date, INTERVAL expr unit)、DATE_SUB(...):加減間隔。
  • DATEDIFF(date1, date2):天數差。
  • TIMESTAMPDIFF(unit, dt1, dt2):指定單位差值。
  • 直接相減:CURDATE() - birth 回傳整數(YYYYMMDD 差值),非天數;精確天數請用 DATEDIFF。

TIMESTAMP 自動更新機制

表中第一個 TIMESTAMP 欄位具備自動初始化與更新特性:

  1. INSERT/LOAD DATA 未指定該欄位 → 設為當前時間。
  2. UPDATE 未指定該欄位且其他欄位值改變 → 更新為當前時間。
  3. 明確設為 NULL → 更新為當前時間。

其餘 TIMESTAMP 欄位需明確設為 NULL 或 NOW() 才會更新。

實戰範例

CREATE TABLE student (
  id INT PRIMARY KEY,
  name CHAR(16),
  score TINYINT,
  mod_time TIMESTAMP
);

INSERT INTO student (id, name, score) VALUES (1, 'Tom', 80);
-- mod_time 自動填入建立時間

UPDATE student SET score=90 WHERE id=1;
-- mod_time 自動更新為修改時間

UPDATE student SET mod_time=NULL WHERE id=1;
-- 強制刷新 mod_time 為當前時間

UPDATE student SET score=85, mod_time=mod_time WHERE id=1;
-- 修改分數但保持 mod_time 不變

常用格式化與解析函數

函數用途範例
DATE_FORMAT(dt, fmt)日期時間格式化輸出DATE_FORMAT(NOW(), '%Y-%m-%d %H:%i')
STR_TO_DATE(str, fmt)字串解析為日期STR_TO_DATE('2024/05/20', '%Y/%m/%d')
UNIX_TIMESTAMP([dt])轉為 Unix 時間戳UNIX_TIMESTAMP()
FROM_UNIXTIME(ts)時間戳轉日期時間FROM_UNIXTIME(1716200000)
EXTRACT(unit FROM dt)擷取部分EXTRACT(MONTH FROM NOW())

時區處理

  • 伺服器時區:system_time_zone、time_zone 系統變數。
  • 連線時區:SET time_zone = '+08:00'; 或 SET time_zone = 'Asia/Taipei';(需載入時區表)。
  • TIMESTAMP 以 UTC 儲存,讀取時轉換為連線時區;DATETIME 不轉換。

結語

善用 MySQL 豐富的日期時間函數與 TIMESTAMP 自動更新特性,能輕鬆實現建立/修改時間追蹤、年齡計算、報表區間篩選等常見需求。注意時區一致性與應用層驗證,避免「不嚴格日期」導致的邏輯錯誤。

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