常用查詢模式
-- 最近 30 天數據
SELECT * FROM tbl WHERE TO_DAYS(NOW()) - TO_DAYS(date_col) <= 30;
日期提取函數
| 函數 | 返回值 | 範例 |
| DAYOFWEEK(date) | 星期索引 | 1=Sun ... 7=Sat |
| WEEKDAY(date) | 星期索引 | 0=Mon ... 6=Sun |
| DAYOFMONTH(date) | 月內天數 | 1-31 |
| DAYOFYEAR(date) | 年內天數 | 1-366 |
| MONTH(date) | 月份 | 1-12 |
| DAYNAME(date) | 星期名 | Thursday |
| MONTHNAME(date) | 月份名 | February |
| QUARTER(date) | 季度 | 1-4 |
| YEAR(date) | 年份 | 1000-9999 |
周計算:WEEK() 與 YEARWEEK()
WEEK(date[, mode]) -- mode 0-3 控制週起始日與返回範圍
YEARWEEK(date[, mode]) -- 返回 YYYYWW,跨年周正確歸屬
-- 建議用 mode 2 或 3(ISO 8601),避免第 0 周困惑
時間提取
| 函數 | 範圍 |
| HOUR(time) | 0-23 |
| MINUTE(time) | 0-59 |
| SECOND(time) | 0-59 |
日期算術:DATE_ADD / DATE_SUB / ADDDATE / SUBDATE
DATE_ADD(date, INTERVAL expr type)
-- type: SECOND, MINUTE, HOUR, DAY, MONTH, YEAR,
-- MINUTE_SECOND, HOUR_MINUTE, DAY_HOUR, YEAR_MONTH,
-- HOUR_SECOND, DAY_MINUTE, DAY_SECOND
-- 例:
SELECT '1997-12-31 23:59:59' + INTERVAL 1 SECOND; -- 1998-01-01 00:00:00
SELECT DATE_ADD('1998-01-30', INTERVAL 1 MONTH); -- 1998-02-28 (自動調整月末)
EXTRACT - 提取日期部分
EXTRACT(YEAR FROM '1999-07-02'); -- 1999
EXTRACT(YEAR_MONTH FROM '1999-07-02'); -- 199907
EXTRACT(DAY_MINUTE FROM '1999-07-02 01:02:03'); -- 20102
天數轉換
TO_DAYS(date) -- 從 Year 0 起的天數(1582 年格里曆前不準)
FROM_DAYS(N) -- 天數轉 DATE
格式化輸出
DATE_FORMAT(date, format) -- 修飾符:%Y %m %d %H %i %s %W %M %D ...
TIME_FORMAT(time, format) -- 僅時分秒修飾符
-- 例:DATE_FORMAT('1997-10-04 22:23:00', '%W %M %Y') → 'Saturday October 1997'
當前時間
NOW() / SYSDATE() / CURRENT_TIMESTAMP -- 'YYYY-MM-DD HH:MM:SS'
CURDATE() / CURRENT_DATE -- 'YYYY-MM-DD'
CURTIME() / CURRENT_TIME -- 'HH:MM:SS'
Unix 時間戳互轉
UNIX_TIMESTAMP([date]) -- 秒數(1970 起),TIMESTAMP 列直接取內部值
FROM_UNIXTIME(unix_ts[, fmt]) -- 反向,可加 DATE_FORMAT 修飾符
秒↔時間
SEC_TO_TIME(seconds) -- 'HH:MM:SS'
TIME_TO_SEC(time) -- 總秒數