系統整理 MySQL 核心日期時間函數,涵蓋提取、運算、格式化、區間計算四大類,附帶實測示例與版本差異說明。
| 函數 | 返回值 | 示例 | 結果 |
|---|---|---|---|
DAYOFWEEK(d) | 星期索引 (1=周日..7=周六) | DAYOFWEEK('1998-02-03') | 3 |
WEEKDAY(d) | 星期索引 (0=周一..6=周日) | WEEKDAY('1998-02-03') | 1 |
DAYOFMONTH(d) | 月內第幾天 (1-31) | DAYOFMONTH('1998-02-03') | 3 |
DAYOFYEAR(d) | 年內第幾天 (1-366) | DAYOFYEAR('1998-02-03') | 34 |
MONTH(d) | 月份 (1-12) | MONTH('1998-02-03') | 2 |
DAYNAME(d) | 星期名 | DAYNAME('1998-02-05') | Thursday |
MONTHNAME(d) | 月份名 | MONTHNAME('1998-02-05') | February |
QUARTER(d) | 季度 (1-4) | QUARTER('98-04-01') | 2 |
YEAR(d) | 年份 (1000-9999) | YEAR('98-02-03') | 1998 |
WEEK(date[, mode])
YEARWEEK(date[, mode])
mode 參數詳解:
| mode | 周起始日 | 返回範圍 | 備註 |
|---|---|---|---|
| 0 | 周日 | 0-53 | 美式習慣 |
| 1 | 周一 | 0-53 | |
| 2 | 周日 | 1-53 | |
| 3 | 周一 | 1-53 | ISO 8601 標準 |
WEEK('2000-01-01', 0) → 0(屬於上一年最後一周)WEEK('2000-01-01', 2) → 52(ISO 模式歸屬上年)YEARWEEK('2000-01-01') → 199952(年周組合,避免歧義)建議:跨年周計算統一使用
mode=3(ISO 8601) 或YEARWEEK(),避免業務邏輯錯誤。
| 函數 | 返回範圍 | 示例 |
|---|---|---|
HOUR(t) | 0-23 | HOUR('10:05:03') → 10 |
MINUTE(t) | 0-59 | MINUTE('98-02-03 10:05:03') → 5 |
SECOND(t) | 0-59 | SECOND('10:05:03') → 3 |
YYMM 或 YYYYMM(非日期類型)PERIOD_ADD(9801, 2) → 199803(加 2 月)PERIOD_DIFF(9802, 199703) → 11(月數差)DATE_ADD(date, INTERVAL expr type)
DATE_SUB(date, INTERVAL expr type)
type 與 expr 格式對應表:
| type | expr 格式 | 示例 |
|---|---|---|
| SECOND | SECONDS | INTERVAL 1 SECOND |
| MINUTE | MINUTES | INTERVAL 5 MINUTE |
| HOUR | HOURS | INTERVAL 2 HOUR |
| DAY | DAYS | INTERVAL 10 DAY |
| MONTH | MONTHS | INTERVAL 3 MONTH |
| YEAR | YEARS | INTERVAL 1 YEAR |
| MINUTE_SECOND | "MINUTES:SECONDS" | INTERVAL "5:30" MINUTE_SECOND |
| HOUR_MINUTE | "HOURS:MINUTES" | INTERVAL "2:30" HOUR_MINUTE |
| DAY_HOUR | "DAYS HOURS" | INTERVAL "3 5" DAY_HOUR |
| YEAR_MONTH | "YEARS-MONTHS" | INTERVAL "1-6" YEAR_MONTH |
| HOUR_SECOND | "HOURS:MINUTES:SECONDS" | INTERVAL "1:30:45" HOUR_SECOND |
| DAY_MINUTE | "DAYS HOURS:MINUTES" | INTERVAL "2 12:30" DAY_MINUTE |
| DAY_SECOND | "DAYS HOURS:MINUTES:SECONDS" | INTERVAL "1 2:30:45" DAY_SECOND |
"1997-12-31 23:59:59" + INTERVAL 1 SECOND → 1998-01-01 00:00:00
INTERVAL 1 DAY + "1997-12-31" → 1998-01-01
"1998-01-01" - INTERVAL 1 SECOND → 1997-12-31 23:59:59
DATE_ADD("1997-12-31 23:59:59", INTERVAL 1 DAY) → 1998-01-01 23:59:59
DATE_ADD("1997-12-31 23:59:59", INTERVAL "1:1" MINUTE_SECOND) → 1998-01-01 00:01:00
DATE_SUB("1998-01-01 00:00:00", INTERVAL "1 1:1:1" DAY_SECOND) → 1997-12-30 22:58:59
DATE_ADD("1998-01-01 00:00:00", INTERVAL "-1 10" DAY_HOUR) → 1997-12-30 14:00:00
DATE_SUB("1998-01-02", INTERVAL 31 DAY) → 1997-12-02
date 為 DATE 且間隔僅含 YEAR/MONTH/DAY → 返回 DATE+/- 運算符簡寫(右操作數為日期/間隔)SELECT * FROM tbl_name
WHERE TO_DAYS(NOW()) - TO_DAYS(date_col) <= 30;