DATE_ADD(date, INTERVAL expr unit)
DATE_SUB(date, INTERVAL expr unit)
實戰示例:查詢最近 3 小時創建的記錄
SELECT id FROM my_table
WHERE create_time >= DATE_SUB(NOW(), INTERVAL 3 HOUR)
AND create_time < NOW();
支持的 INTERVAL 單位:
| MICROSECOND | SECOND | MINUTE | HOUR | DAY | WEEK |
| MONTH | QUARTER | YEAR | SECOND_MICROSECOND | MINUTE_MICROSECOND | MINUTE_SECOND |
| HOUR_MICROSECOND | HOUR_SECOND | HOUR_MINUTE | DAY_MICROSECOND | DAY_SECOND | DAY_MINUTE |
| DAY_HOUR | YEAR_MONTH |
MySQL 允許對日期時間直接加減數值,按 YYYYMMDDHHMMSS 位權重理解:
| 表達式 | 含義 |
|---|---|
+1 / +01 | 加 1 秒 |
+101 / +0101 | 加 1 分 1 秒 |
+10101 | 加 1 時 1 分 1 秒 |
+1010101 | 加 1 天 1 時 1 分 1 秒 |
+101010101 | 加 1 月 1 天 1 時 1 分 1 秒 |
+1101010101 | 加 1 年 1 月 1 天 1 時 1 分 1 秒 |
注意:此語法不可讀且易出錯,推薦使用標準 INTERVAL 語法。
| 函數 | 返回值 | 示例 | 結果 |
|---|---|---|---|
DATEDIFF(d1, d2) | 天數差 (忽略時間部分) | DATEDIFF('2016-03-29', '2016-03-29') | 0 |
DATEDIFF('2016-03-29 00:00:00', '2016-03-29 23:59:59') | 0 | ||
TIMEDIFF(t1, t2) | 時間差 HH:MM:SS | TIMEDIFF('2016-03-30 00:00:00', '2016-03-28 11:11:11') | '1 12:48:49' |
TIMEDIFF('00:00:00', '11:11:11') | '-11:11:11' |
DATE_FORMAT(date, format)
常用場景:
-- 格式化顯示
SELECT DATE_FORMAT(insert_time, '%Y-%m-%d %H:%i:%S') AS insert_time FROM user;
-- 按日期分組統計
SELECT DATE_FORMAT(insert_time, '%Y-%m-%d') AS day, COUNT(id) AS cnt
FROM user GROUP BY day;
格式符號完整表:
| 符號 | 含義 | 示例 |
|---|---|---|
| %Y | 4位年 | 2016 |
| %m | 月(01-12) | 03 |
| %d | 日(01-31) | 29 |
| %H | 時(00-23) | 14 |
| %i | 分(00-59) | 30 |
| %S / %s | 秒(00-59) | 59 |
| %T | 時間24制(HH:MM:SS) | 14:30:59 |
| %r | 時間12制(hh:mm:ss AM/PM) | 02:30:59 PM |
| %W | 星期名 | Tuesday |
| %M | 月名 | March |
| %w | 星期(0=周日) | 2 |
| %U | 周數(周日為首) | 13 |
| %u | 周數(周一為首) | 13 |
| %% | 字面% | % |
GROUP BY DATE_FORMAT(create_time, '%Y-%m')WHERE create_time >= DATE_FORMAT(NOW(), '%Y-%m-01')WHERE create_time >= DATE_FORMAT(DATE_SUB(NOW(), INTERVAL 1 MONTH), '%Y-%m-01') AND create_time < DATE_FORMAT(NOW(), '%Y-%m-01')SELECT DATE_FORMAT(created, '%Y/%m/%d %H:%i') ...DATE_FORMAT 在 WHERE 條件中使用會導致全表掃描,**避免**對列使用函數,改用範圍查詢:WHERE create_time >= '2016-03-01' AND create_time < '2016-04-01'DATEDIFF 只比較日期部分,時間部分被忽略,精確到秒請用 TIMESTAMPDIFF(SECOND, ...)。熟練掌握這幾個核心時間函數,能解決 90% 以上的業務時間計算需求。