MySQL 日期時間函數完整速查
開發中頻繁用到日期時間處理,官方文檔分散,這裡整理為分類速查表,支援直接複製使用。
取得當前日期時間
| 函數 | 返回值 | 備註 |
NOW() / CURRENT_TIMESTAMP() | YYYY-MM-DD HH:MM:SS | 當前日期時間 |
CURDATE() / CURRENT_DATE() / SYSDATE() | YYYY-MM-DD | 當前日期 |
CURTIME() | HH:MM:SS | 當前時間 |
日期部份提取
| 函數 | 說明 | 範例結果 |
YEAR(date) | 年份 | 2024 |
MONTH(date) | 月份 (1-12) | 1 |
MONTHNAME(date) | 月份英文名 | January |
DAY(date) / DAYOFMONTH(date) | 日期 (1-31) | 15 |
DAYOFWEEK(date) | 星期 (1=週日..7=週六) | 2 |
WEEKDAY(date) | 星期 (0=週一..6=週日) | 1 |
DAYNAME(date) | 星期英文名 | Monday |
QUARTER(date) | 季度 (1-4) | 1 |
DAYOFYEAR(date) | 一年中的第幾天 | 15 |
WEEK(date, mode) | 一年中的第幾週 | mode=0 週日起算,1 週一起算 |
HOUR(time) | 小時 (0-23) | 14 |
MINUTE(time) | 分鐘 (0-59) | 30 |
SECOND(time) | 秒 (0-59) | 45 |
日期格式化:DATE_FORMAT(date, format)
| 格式符 | 含義 | 範例 |
| %Y | 4位年份 | 2024 |
| %y | 2位年份 | 24 |
| %M | 月份英文全名 | January |
| %m | 月份兩位數字 | 01 |
| %b | 月份縮寫 | Jan |
| %D | 帶後綴的日期 | 1st, 2nd |
| %d | 日期兩位數字 | 15 |
| %e | 日期數字(不補0) | 15 |
| %W | 星期英文全名 | Monday |
| %a | 星期縮寫 | Mon |
| %w | 星期數字(0=週日) | 1 |
| %H | 24制小時(00-23) | 14 |
| %k | 24制小時(0-23) | 14 |
| %I / %l | 12制小時(01-12 / 1-12) | 02 / 2 |
| %i | 分鐘(00-59) | 30 |
| %S / %s | 秒(00-59) | 45 |
| %r | 12制時間 hh:mm:ss AM/PM | 02:30:45 PM |
| %T | 24制時間 hh:mm:ss | 14:30:45 |
| %p | AM/PM | PM |
| %j | 一年中的天數(001-366) | 015 |
| %% | 字面 % | % |
-- 常用範例
SELECT DATE_FORMAT(NOW(), '%Y-%m-%d %H:%i:%s'); -- 2024-01-15 14:30:45
SELECT DATE_FORMAT(NOW(), '%Y年%m月%d日 %H時%i分'); -- 2024年01月15日 14時30分
日期加減運算
| 函數 | 語法 | 說明 |
| DATE_ADD / ADDDATE | DATE_ADD(date, INTERVAL expr unit) | 加法 |
| DATE_SUB / SUBDATE | DATE_SUB(date, INTERVAL expr unit) | 減法 |
INTERVAL 単位:
SECOND, MINUTE, HOUR, DAY, MONTH, YEAR
MINUTE_SECOND -- "分:秒"
HOUR_MINUTE -- "時:分"
DAY_HOUR -- "天 時"
YEAR_MONTH -- "年-月"
HOUR_SECOND -- "時:分:秒"
DAY_MINUTE -- "天 時:分"
DAY_SECOND -- "天 時:分:秒"
-- 範例
SELECT DATE_ADD(NOW(), INTERVAL 5 DAY); -- 5天後
SELECT DATE_SUB(NOW(), INTERVAL 3 MONTH); -- 3個月前
SELECT DATE_ADD('2024-01-15', INTERVAL '2 12' DAY_HOUR); -- 2天12小時後
時間戳轉換
| 函數 | 說明 |
UNIX_TIMESTAMP() | 當前 Unix 時間戳(秒) |
UNIX_TIMESTAMP(date) | 指定日期轉 Unix 時間戳 |
FROM_UNIXTIME(ts) | 時間戳轉 YYYY-MM-DD HH:MM:SS |
FROM_UNIXTIME(ts, format) | 時間戳轉自訂格式 |
SELECT UNIX_TIMESTAMP(); -- 1705305045
SELECT FROM_UNIXTIME(1705305045); -- 2024-01-15 14:30:45
SELECT FROM_UNIXTIME(1705305045, '%Y-%m-%d'); -- 2024-01-15
秒數與時間互轉
| 函數 | 說明 |
TIME_TO_SEC(time) | HH:MM:SS 轉總秒數 |
SEC_TO_TIME(seconds) | 秒數轉 HH:MM:SS |
SELECT TIME_TO_SEC('01:30:00'); -- 5400
SELECT SEC_TO_TIME(5400); -- 01:30:00
天數轉換(歷史日期慎用)
| 函數 | 說明 |
TO_DAYS(date) | 日期轉西元0年迄今天數(1582年前不準) |
FROM_DAYS(N) | 天數轉日期(1582年前不準) |
實用組合技
-- 本月第一天
SELECT DATE_FORMAT(NOW(), '%Y-%m-01');
-- 本月最後一天
SELECT LAST_DAY(NOW());
-- 兩日期相差天數
SELECT DATEDIFF('2024-12-31', '2024-01-01'); -- 365
-- 判斷是否為週末
SELECT CASE WHEN WEEKDAY(NOW()) IN (5,6) THEN '週末' ELSE '工作日' END;