首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL 常用時間函數進階指南:DATE_ADD/DATEDIFF/DATE_FORMAT 實戰詳解

     編輯:MySQL 資料庫相關知識

核心時間函數分類

1. 日期加減運算:DATE_ADD / DATE_SUB

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 單位:

MICROSECONDSECONDMINUTEHOURDAYWEEK
MONTHQUARTERYEARSECOND_MICROSECONDMINUTE_MICROSECONDMINUTE_SECOND
HOUR_MICROSECONDHOUR_SECONDHOUR_MINUTEDAY_MICROSECONDDAY_SECONDDAY_MINUTE
DAY_HOURYEAR_MONTH

2. 直接數值加減(舊版兼容語法)

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 語法。

3. 日期/時間差值:DATEDIFF / TIMEDIFF

函數返回值示例結果
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:SSTIMEDIFF('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'

4. 日期格式化:DATE_FORMAT

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;

格式符號完整表:

符號含義示例
%Y4位年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')
  • 格式化導出 CSV: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% 以上的業務時間計算需求。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved