MySQL 日期時間函數完整速查(第二版)
補充更多實用組合技與週期計算範例,適合直接複製到專案文檔。
快速導覽
當前日期時間
| 函數 | 返回 | 備註 |
| NOW() / CURRENT_TIMESTAMP() | YYYY-MM-DD HH:MM:SS | 語句執行開始時刻固定 |
| SYSDATE() | YYYY-MM-DD HH:MM:SS | 實時返回,函數執行時刻 |
| CURDATE() / CURRENT_DATE() | YYYY-MM-DD | |
| CURTIME() / CURRENT_TIME() | HH:MM:SS | |
| 函數 | 範例 | 說明 |
| YEAR(d) | 2024 | |
| QUARTER(d) | 1 | 季度 1-4 |
| MONTH(d) | 1 | 1-12 |
| MONTHNAME(d) | January | 英文全名 |
| WEEK(d, mode) | 3 | mode=0 週日, 1 週一 |
| DAY(d) / DAYOFMONTH(d) | 15 | 1-31 |
| DAYOFYEAR(d) | 15 | 1-366 |
| DAYOFWEEK(d) | 2 | 1=週日..7=週六 |
| WEEKDAY(d) | 1 | 0=週一..6=週日 |
| DAYNAME(d) | Monday | 英文全名 |
| HOUR(t) | 14 | 0-23 |
| MINUTE(t) | 30 | 0-59 |
| SECOND(t) | 45 | 0-59 |
| 符號 | 含義 | 範例 |
| %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制時間 AM/PM | 02:30:45 PM |
| %T | 24制時間 | 14:30:45 |
| %p | AM/PM | PM |
| %j | 年內天數(001-366) | 015 |
| %% | 字面% | % |
日期加減運算
DATE_ADD(date, INTERVAL expr unit) -- 加
DATE_SUB(date, INTERVAL expr unit) -- 減
ADDDATE(date, INTERVAL expr unit) -- 同 DATE_ADD
SUBDATE(date, INTERVAL expr unit) -- 同 DATE_SUB
-- 單位
SECOND, MINUTE, HOUR, DAY, WEEK, MONTH, QUARTER, YEAR
MINUTE_SECOND, HOUR_MINUTE, DAY_HOUR, YEAR_MONTH
HOUR_SECOND, DAY_MINUTE, DAY_SECOND
Unix 時間戳互轉
UNIX_TIMESTAMP() -- 當前秒數
UNIX_TIMESTAMP('2024-01-15') -- 指定日期轉秒數
FROM_UNIXTIME(1705305045) -- 秒數轉 datetime
FROM_UNIXTIME(ts, '%Y-%m-%d') -- 秒數轉自訂格式
秒數與時間互轉
TIME_TO_SEC('01:30:00') -- 5400
SEC_TO_TIME(5400) -- 01:30:00
實用組合技
-- 本月第一天 00:00:00
SELECT DATE_FORMAT(NOW(), '%Y-%m-01 00:00:00');
-- 本月最後一天 23:59:59
SELECT DATE_FORMAT(LAST_DAY(NOW()), '%Y-%m-%d 23:59:59');
-- 兩日期相差天數
SELECT DATEDIFF('2024-12-31', '2024-01-01'); -- 365
-- 判斷週末
SELECT CASE WHEN WEEKDAY(NOW()) IN (5,6) THEN '週末' ELSE '工作日' END;
-- 年齡計算
SELECT FLOOR(DATEDIFF(NOW(), '1990-05-20') / 365.25);
-- 當季第一天
SELECT DATE_FORMAT(NOW(), CONCAT('%Y-', LPAD(QUARTER(NOW())*3-2,2,'0'), '-01'));
-- 最近一個週一
SELECT DATE_SUB(NOW(), INTERVAL WEEKDAY(NOW()) DAY);
天數轉換(歷史日期慎用)
TO_DAYS('2024-01-15') -- 738523
FROM_DAYS(738523) -- 2024-01-15
-- 注意:1582 年前不準確(格里曆改革)