MySQL 提供豐富的日期時間函數族,涵蓋獲取、提取、計算、格式化、轉換、時區處理等全場景。本文系統整理官方文檔核心函數,附帶實戰示例,作為開發查閱手冊。
| 函數 | 返回值 | 示例 |
|---|---|---|
NOW() / SYSDATE() / CURRENT_TIMESTAMP() | YYYY-MM-DD HH:MM:SS | 2014-10-29 10:52:57 |
CURDATE() / CURRENT_DATE() | YYYY-MM-DD | 2014-10-29 |
CURTIME() / CURRENT_TIME() | HH:MM:SS | 10:59:58 |
UTC_TIMESTAMP(), UTC_DATE(), UTC_TIME() | UTC 時間 | 本地時間 -8 小時 |
注意:NOW() 在語句開始時固定值;SYSDATE() 執行時動態取值。
SET @dt = '2008-09-10 07:15:30.123456';
YEAR(@dt) -- 2008
QUARTER(@dt) -- 3
MONTH(@dt) -- 9
WEEK(@dt) -- 36 (模式 0: 週日起算)
DAY(@dt) -- 10
HOUR(@dt) -- 7
MINUTE(@dt) -- 15
SECOND(@dt) -- 30
MICROSECOND(@dt) -- 123456
DAYNAME(@dt) -- Wednesday
MONTHNAME(@dt) -- September
EXTRACT(unit FROM date) 通用提取函數,支持組合單位:YEAR_MONTH、DAY_HOUR、HOUR_SECOND 等。
DAYOFWEEK():1=週日 ... 7=週六 (ODBC 標準)WEEKDAY():0=週一 ... 6=週日WEEK(date, mode):mode=0 週日起算,mode=1 週一起算WEEKOFYEAR() = WEEK(date,3)YEARWEEK():返回 年+周 如 200831DATE_ADD(date, INTERVAL expr unit)
DATE_SUB(date, INTERVAL expr unit)
-- 支持單位:SECOND, MINUTE, HOUR, DAY, WEEK, MONTH, QUARTER, YEAR
-- 組合單位:MINUTE_SECOND, HOUR_MINUTE, DAY_HOUR, YEAR_MONTH,
-- HOUR_SECOND, DAY_MINUTE, DAY_SECOND
SELECT DATE_ADD('1997-12-31 23:59:59', INTERVAL 1 SECOND); -- 1998-01-01 00:00:00
SELECT DATE_ADD('1997-12-31 23:59:59', INTERVAL '1:1' MINUTE_SECOND); -- 1998-01-01 00:01:00
SELECT DATE_SUB('1998-01-01 00:00:00', INTERVAL '1 1:1:1' DAY_SECOND); -- 1997-12-30 22:58:59
DATEDIFF(date1, date2):返回天數差 (date1 - date2)TIMEDIFF(time1, time2):返回時間差 (time1 - time2),參數類型必須一致TIMESTAMPDIFF(unit, datetime1, datetime2):按指定單位計算差值,功能更強DATE_FORMAT(date, format) -- 日期→字符串
TIME_FORMAT(time, format) -- 時間→字符串
STR_TO_DATE(str, format) -- 字符串→日期
-- 常用格式符:
-- %Y 4位年 %y 2位年 %m 月(01-12) %c 月(1-12)
-- %d 日(01-31) %e 日(1-31) %D 英文後綴(1st,2nd)
-- %H 時(00-23) %h/%I 時(01-12) %k 時(0-23) %l 時(1-12)
-- %i 分(00-59) %S/%s 秒(00-59) %f 微秒
-- %W 週名 %a 週名縮寫 %w 週幾(0=週日)
-- %j 年內天數(001-366) %U/%u 周數
-- %r 12小時制 %T 24小時制 %p AM/PM
UNIX_TIMESTAMP() / UNIX_TIMESTAMP(date) -- 日期→Unix秒數
FROM_UNIXTIME(unix_ts) / FROM_UNIXTIME(unix_ts, format) -- 秒數→日期
TO_DAYS(date) -- 日期→紀元天數 (0000-00-00 起)
FROM_DAYS(days) -- 天數→日期
TIME_TO_SEC(time) -- 時間→總秒數
SEC_TO_TIME(sec) -- 秒數→時間
CONVERT_TZ(dt, from_tz, to_tz)
SELECT CONVERT_TZ('2008-08-08 12:00:00', '+08:00', '+00:00'); -- 2008-08-08 04:00:00
-- 等價於 DATE_ADD(dt, INTERVAL -8 HOUR)
PERIOD_ADD(P, N) -- YYYYMM + N 月
PERIOD_DIFF(P1, P2) -- 月數差
MAKEDATE(year, dayofyear) -- 2001, 32 → '2001-02-01'
MAKETIME(hour, minute, second) -- 12,15,30 → '12:15:30'
| 類型 | 存儲 | 范圍 | 適用場景 |
|---|---|---|---|
| DATETIME | 8 bytes | 1000-01-01 ~ 9999-12-31 | 通用業務時間,無時區依賴 |
| TIMESTAMP | 4 bytes | 1970-01-01 ~ 2038-01-19 | 自動記錄創建/更新時間,跨時區應用 |
| DATE | 3 bytes | 1000-01-01 ~ 9999-12-31 | 純日期業務 (生日、合同日期) |
| TIME | 3 bytes | -838:59:59 ~ 838:59:59 | 時間間隔、每日定時任務 |
| YEAR | 1 byte | 1901 ~ 2155 | 年份標記 |
提示:MySQL 5.6.4+ 支持毫秒/微秒精度 (DATETIME(6)),舊版本僅支持秒級。