一、日期部份提取
| 函數 | 回傳值 | 範例 | 結果 |
| DAYOFWEEK(d) | 1=週日 ... 7=週六 | DAYOFWEEK('1998-02-03') | 3 |
| WEEKDAY(d) | 0=週一 ... 6=週日 | WEEKDAY('1997-10-04') | 5 |
| 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 |
| WEEK(d[,mode]) | 週數 0-53 | WEEK('1998-02-20',1) | 8 |
| YEAR(d) | 1000-9999 | YEAR('98-02-03') | 1998 |
| 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 |
二、日期運算:DATE_ADD / DATE_SUB / ADDDATE / SUBDATE
DATE_ADD(date, INTERVAL expr unit)
DATE_SUB(date, INTERVAL expr unit)
unit 關鍵字與 expr 格式對照:
| unit | expr 格式 | 範例 |
| SECOND | SECONDS | INTERVAL 10 SECOND |
| MINUTE | MINUTES | INTERVAL 30 MINUTE |
| HOUR | HOURS | INTERVAL 2 HOUR |
| DAY | DAYS | INTERVAL 5 DAY |
| MONTH | MONTHS | INTERVAL 3 MONTH |
| YEAR | YEARS | INTERVAL 1 YEAR |
| MINUTE_SECOND | "MINUTES:SECONDS" | INTERVAL '30:15' MINUTE_SECOND |
| HOUR_MINUTE | "HOURS:MINUTES" | INTERVAL '2:30' HOUR_MINUTE |
| DAY_HOUR | "DAYS HOURS" | INTERVAL '1 2' DAY_HOUR |
| YEAR_MONTH | "YEARS-MONTHS" | INTERVAL '1-3' YEAR_MONTH |
| HOUR_SECOND | "HOURS:MINUTES:SECONDS" | INTERVAL '1:30:15' HOUR_SECOND |
| DAY_MINUTE | "DAYS HOURS:MINUTES" | INTERVAL '1 2:30' DAY_MINUTE |
| DAY_SECOND | "DAYS HOURS:MINUTES:SECONDS" | INTERVAL '1 2:30:15' DAY_SECOND |
常用範例
SELECT '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 DAY); -- 1998-01-01 23:59:59
SELECT DATE_SUB('1998-01-01', INTERVAL 31 DAY); -- 1997-12-01
SELECT DATE_ADD('1998-01-30', INTERVAL 1 MONTH); -- 1998-02-28 (月末自動調整)
三、EXTRACT 提取複合部份
SELECT EXTRACT(YEAR_MONTH FROM '1999-07-02 01:02:03'); -- 199907
SELECT EXTRACT(DAY_MINUTE FROM '1999-07-02 01:02:03'); -- 20102 (02日 01:02)
四、天數轉換:TO_DAYS / FROM_DAYS
SELECT TO_DAYS('1997-10-07'); -- 729669 (從公元 0 年起算天數)
SELECT FROM_DAYS(729669); -- '1997-10-07'
⚠️ 僅適用格里曆(1582 年後)。
五、格式化輸出:DATE_FORMAT / TIME_FORMAT
| 修飾符 | 含義 | 範例輸出 |
| %Y | 4 位年 | 1997 |
| %y | 2 位年 | 97 |
| %m | 月 01-12 | 10 |
| %c | 月 1-12 | 10 |
| %d | 日 01-31 | 04 |
| %e | 日 1-31 | 4 |
| %H | 時 00-23 | 22 |
| %k | 時 0-23 | 22 |
| %h/%I | 時 01-12 | 10 |
| %i | 分 00-59 | 23 |
| %s/%S | 秒 00-59 | 00 |
| %W | 星期全名 | Saturday |
| %a | 星期縮寫 | Sat |
| %M | 月份全名 | October |
| %b | 月份縮寫 | Oct |
| %r | 12h 時間 | 10:23:00 PM |
| %T | 24h 時間 | 22:23:00 |
| %p | AM/PM | PM |
| %j | 年內天數 001-366 | 277 |
SELECT DATE_FORMAT('1997-10-04 22:23:00', '%W %M %Y'); -- Saturday October 1997
SELECT DATE_FORMAT('1997-10-04 22:23:00', '%H:%i:%s'); -- 22:23:00
SELECT DATE_FORMAT('1997-10-04 22:23:00', '%D %y %a %d %m %b %j'); -- 4th 97 Sat 04 10 Oct 277
六、當前時間:NOW / CURDATE / CURTIME
SELECT NOW(); -- '1997-12-15 23:50:26'
SELECT CURDATE(); -- '1997-12-15'
SELECT CURTIME(); -- '23:50:26'
-- 數字語境下自動轉為數值:NOW()+0 = 19971215235026
七、Unix 時間戳互轉:UNIX_TIMESTAMP / FROM_UNIXTIME
SELECT UNIX_TIMESTAMP(); -- 882226357 (秒)
SELECT UNIX_TIMESTAMP('1997-10-04 22:23:00'); -- 875996580
SELECT FROM_UNIXTIME(875996580); -- '1997-10-04 22:23:00'
SELECT FROM_UNIXTIME(UNIX_TIMESTAMP(), '%Y %D %M %h:%i:%s %x'); -- 格式化輸出
八、秒數與時間互轉:SEC_TO_TIME / TIME_TO_SEC
SELECT SEC_TO_TIME(2378); -- '00:39:38'
SELECT TIME_TO_SEC('22:23:00'); -- 80580
實戰技巧
- 本週一 00:00:00:
DATE_SUB(CURDATE(), INTERVAL WEEKDAY(CURDATE()) DAY)
- 本月第一天:
DATE_SUB(CURDATE(), INTERVAL DAYOFMONTH(CURDATE())-1 DAY)
- 上月同期:
DATE_SUB(NOW(), INTERVAL 1 MONTH)
- 年齡計算:
FLOOR(DATEDIFF(CURDATE(), birth) / 365.25)
- 時區轉換:
CONVERT_TZ(dt, 'UTC', 'Asia/Taipei')(需載入時區表)。