日期時間取值函數
| 函數 | 說明 | 範例結果 |
| NOW() / SYSDATE() | 當前日期時間 | 2024-05-20 14:30:00 |
| CURDATE() | 當前日期 | 2024-05-20 |
| CURTIME() | 當前時間 | 14:30:00 |
| YEAR(date) | 年份 | 2024 |
| MONTH(date) | 月份 1-12 | 5 |
| DAY(date) | 月份中的天 1-31 | 20 |
| HOUR(time) | 小時 0-23 | 14 |
| MINUTE(time) | 分鐘 0-59 | 30 |
| SECOND(time) | 秒 0-59 | 0 |
| DAYOFWEEK(date) | 星期索引 1(日)-7(六) | 2 |
| WEEKDAY(date) | 星期索引 0(一)-6(日) | 0 |
| DAYNAME(date) | 星期名稱 | Monday |
| MONTHNAME(date) | 月份名稱 | May |
| QUARTER(date) | 季度 1-4 | 2 |
| WEEK(date[,mode]) | 年度週數,mode 控制週起始日 | 21 |
| DAYOFYEAR(date) | 年度天數 1-366 | 141 |
日期運算:DATE_ADD / DATE_SUB
DATE_ADD(date, INTERVAL expr unit)
DATE_SUB(date, INTERVAL expr unit)
-- 簡寫
date + INTERVAL expr unit
date - INTERVAL expr unit
常用 unit:SECOND、MINUTE、HOUR、DAY、MONTH、YEAR、DAY_HOUR、DAY_SECOND 等複合單位。
實例
SELECT DATE_ADD('2024-05-20', INTERVAL 1 DAY); -- 2024-05-21
SELECT '2024-05-20' + INTERVAL 1 MONTH; -- 2024-06-20
SELECT DATE_SUB(NOW(), INTERVAL '1 12:30' DAY_HOUR); -- 扣 1 天 12.5 小時
日期格式化:DATE_FORMAT
DATE_FORMAT(date, format)
| 格式符 | 含義 |
| %Y | 四位年 |
| %m | 兩位月 01-12 |
| %d | 兩位日 01-31 |
| %H | 24小時 00-23 |
| %i | 分鐘 00-59 |
| %s | 秒 00-59 |
| %W | 星期全名 |
| %M | 月份全名 |
| %r | 12小時 hh:mm:ss AM/PM |
| %T | 24小時 hh:mm:ss |
SELECT DATE_FORMAT(NOW(), '%Y-%m-%d %H:%i:%s'); -- 2024-05-20 14:30:00
時間戳轉換
UNIX_TIMESTAMP([date]) -- 日期轉 Unix 秒數
FROM_UNIXTIME(unix_ts[,fmt]) -- Unix 秒數轉日期字串
SELECT UNIX_TIMESTAMP('2024-05-20 14:30:00'); -- 1716186600
SELECT FROM_UNIXTIME(1716186600, '%Y-%m-%d'); -- 2024-05-20
秒數與時間互轉
SEC_TO_TIME(seconds) -- 秒數轉 HH:MM:SS
TIME_TO_SEC(time) -- 時間轉總秒數
週期運算
PERIOD_ADD(YYMM, N) -- 加 N 月,回傳 YYYYMM
PERIOD_DIFF(P1, P2) -- 兩期間相差月數
實用查詢範例
-- 最近 30 天資料
SELECT * FROM orders
WHERE order_date >= DATE_SUB(CURDATE(), INTERVAL 30 DAY);
-- 本月第一天
SELECT DATE_FORMAT(NOW(), '%Y-%m-01');
-- 下個月第一天
SELECT DATE_ADD(DATE_FORMAT(NOW(), '%Y-%m-01'), INTERVAL 1 MONTH);