MySQL 提供豐富的日期時間函數支援多樣化的資料處理需求。本文系統整理核心函數分類、語法與實用範例,供開發與查詢優化參考。
支援類型:DATE、TIME、DATETIME、TIMESTAMP、YEAR。有效格式請參考官方文件 7.3.6 節。
SELECT * FROM table
WHERE TO_DAYS(NOW()) - TO_DAYS(date_col) <= 30;
| 函數 | 說明 | 回傳範圍 | 範例 |
|---|---|---|---|
DAYOFWEEK(date) | 星期索引(ODBC 標準) | 1=週日 ~ 7=週六 | DAYOFWEEK('1998-02-03') → 3 |
WEEKDAY(date) | 星期索引 | 0=週一 ~ 6=週日 | WEEKDAY('1997-11-05') → 2 |
DAYOFMONTH(date) | 月份中的日期 | 1 ~ 31 | DAYOFMONTH('1998-02-03') → 3 |
DAYOFYEAR(date) | 年份中的天數 | 1 ~ 366 | DAYOFYEAR('1998-02-03') → 34 |
MONTH(date) | 月份 | 1 ~ 12 | MONTH('1998-02-03') → 2 |
DAYNAME(date) | 星期名稱 | 英文名 | DAYNAME('1998-02-05') → 'Thursday' |
MONTHNAME(date) | 月份名稱 | 英文名 | MONTHNAME('1998-02-05') → 'February' |
QUARTER(date) | 季度 | 1 ~ 4 | QUARTER('98-04-01') → 2 |
WEEK(date[,mode]) | 年份中的週數 | 0~53,mode 控制週起始日 | WEEK('1998-02-20',1) → 8 |
YEAR(date) | 年份 | 1000 ~ 9999 | YEAR('98-02-03') → 1998 |
HOUR(time) | 小時 | 0 ~ 23 | HOUR('10:05:03') → 10 |
MINUTE(time) | 分鐘 | 0 ~ 59 | MINUTE('98-02-03 10:05:03') → 5 |
SECOND(time) | 秒數 | 0 ~ 59 | SECOND('10:05:03') → 3 |
| 函數 | 說明 | 範例 |
|---|---|---|
PERIOD_ADD(P,N) | 期間 P (YYMM/YYYYMM) 加 N 個月 | PERIOD_ADD(9801,2) → 199803 |
PERIOD_DIFF(P1,P2) | 兩期間月數差 | PERIOD_DIFF(9802,199703) → 11 |
DATE_ADD/DATE_SUB、ADDDATE/SUBDATE(同義詞),MySQL 3.23+ 支援 +/- 運算子。
| type 關鍵字 | expr 格式 | 範例 |
|---|---|---|
| SECOND | SECONDS | DATE_ADD('1997-12-31 23:59:59', INTERVAL 1 SECOND) → '1998-01-01 00:00:00' |
| MINUTE | MINUTES | — |
| HOUR | HOURS | — |
| DAY | DAYS | DATE_ADD('1997-12-31 23:59:59', INTERVAL 1 DAY) → '1998-01-01 23:59:59' |
| MONTH | MONTHS | — |
| YEAR | YEARS | — |
| MINUTE_SECOND | "MINUTES:SECONDS" | INTERVAL "1:1" MINUTE_SECOND |
| HOUR_MINUTE | "HOURS:MINUTES" | — |
| DAY_HOUR | "DAYS HOURS" | — |
| YEAR_MONTH | "YEARS-MONTHS" | — |
| HOUR_SECOND | "HOURS:MINUTES:SECONDS" | — |
| DAY_MINUTE | "DAYS HOURS:MINUTES" | — |
| DAY_SECOND | "DAYS HOURS:MINUTES:SECONDS" | DATE_SUB('1998-01-01 00:00:00', INTERVAL "11:1:1" DAY_SECOND) → '1997-12-30 22:58:59' |
注意:expr 格式若過短,MySQL 假設省略左側高位單位。日期超出月份天數上限會自動調整(如 1/30 + 1 month → 2/28)。
| 函數 | 說明 | 範例 |
|---|---|---|
TO_DAYS(date) | 日期轉絕對天數(從 Year 0) | TO_DAYS('1997-10-07') → 729669 |
FROM_DAYS(N) | 天數轉日期 | FROM_DAYS(729669) → '1997-10-07' |
DATE_FORMAT(date,format) | 依格式字串輸出 | 見下表修飾符 |
TIME_FORMAT(time,format) | 時間格式化 | 僅支援時分秒修飾符 |
UNIX_TIMESTAMP([date]) | 轉 Unix 時間戳 | UNIX_TIMESTAMP('1997-10-04 22:23:00') → 875996580 |
FROM_UNIXTIME(ts[,format]) | 時間戳轉日期 | FROM_UNIXTIME(875996580) → '1997-10-04 22:23:00' |
SEC_TO_TIME(sec) | 秒數轉 HH:MM:SS | SEC_TO_TIME(2378) → '00:39:38' |
TIME_TO_SEC(time) | 時間轉總秒數 | TIME_TO_SEC('22:23:00') → 80580 |
| 修飾符 | 意義 | 修飾符 | 意義 |
|---|---|---|---|
%Y | 4 位年份 | %y | 2 位年份 |
%M | 月份名稱 | %b | 縮寫月份名 |
%m | 月份 (01-12) | %c | 月份 (1-12) |
%d | 日期 (00-31) | %e | 日期 (0-31) |
%H | 小時 (00-23) | %h/%I | 小時 (01-12) |
%i | 分鐘 (00-59) | %S/%s | 秒 (00-59) |
%W | 星期名稱 | %a | 縮寫星期名 |
%r | 12 小時制時間 | %T | 24 小時制時間 |
%j | 年內天數 (001-366) | %% | 字面 % 符號 |
CURDATE() / CURRENT_DATE:YYYY-MM-DDCURTIME() / CURRENT_TIME:HH:MM:SSNOW() / SYSDATE() / CURRENT_TIMESTAMP:YYYY-MM-DD HH:MM:SS善用這些函數能大幅簡化日期邏輯處理,提升查詢效能與程式碼可讀性。