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

MySQL 日期與時間函數完整攻略:常用函數、格式化與運算實例

     編輯:MySQL 資料庫相關知識

MySQL 提供豐富的日期時間函數,涵蓋擷取、運算、格式化、轉換等場景。本文系統整理核心函數用法,並附上實戰範例,方便開發快速查閱。

常用擷取函數

函數說明範例結果
DAYOFWEEK(date)星期索引 (1=週日...7=週六)DAYOFWEEK('1998-02-03')3
WEEKDAY(date)星期索引 (0=週一...6=週日)WEEKDAY('1997-10-04')5
DAYOFMONTH(date)月份中的日期 (1-31)DAYOFMONTH('1998-02-03')3
DAYOFYEAR(date)年中的第幾天 (1-366)DAYOFYEAR('1998-02-03')34
MONTH(date)月份 (1-12)MONTH('1998-02-03')2
DAYNAME(date)星期名稱DAYNAME('1998-02-05')Thursday
MONTHNAME(date)月份名稱MONTHNAME('1998-02-05')February
QUARTER(date)季度 (1-4)QUARTER('98-04-01')2
WEEK(date[,mode])週數,mode=0 週日起算,1 週一起算WEEK('1998-02-20',1)8
YEAR(date)年份 (1000-9999)YEAR('98-02-03')1998
HOUR(time)小時 (0-23)HOUR('10:05:03')10
MINUTE(time)分鐘 (0-59)MINUTE('10:05:03')5
SECOND(time)秒 (0-59)SECOND('10:05:03')3

期間運算函數

  • PERIOD_ADD(P,N):期間 P (格式 YYMM/YYYYMM) 加 N 月 → 回傳 YYYYMM。
    例:PERIOD_ADD(9801,2) → 199803
  • PERIOD_DIFF(P1,P2):兩期間相差月數。
    例:PERIOD_DIFF(9802,199703) → 11

日期加減運算:DATE_ADD / DATE_SUB / ADDDATE / SUBDATE

語法:DATE_ADD(date, INTERVAL expr type),type 關鍵字對應格式如下:

type意義expr 格式範例
SECOND秒SECONDS
MINUTE分MINUTES
HOUR時HOURS
DAY天DAYS
MONTH月MONTHS
YEAR年YEARS
MINUTE_SECOND分:秒"MINUTES:SECONDS"
HOUR_MINUTE時:分"HOURS:MINUTES"
DAY_HOUR天 時"DAYS HOURS"
YEAR_MONTH年-月"YEARS-MONTHS"
HOUR_SECOND時:分:秒"HOURS:MINUTES:SECONDS"
DAY_MINUTE天 時:分"DAYS HOURS:MINUTES"
DAY_SECOND天 時:分:秒"DAYS HOURS:MINUTES:SECONDS"

實用範例:

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-02', INTERVAL 31 DAY);         -- 1997-12-02
SELECT DATE_ADD('1998-01-01', INTERVAL '-1 10' DAY_HOUR); -- 1997-12-30 14:00:00

提示: INTERVAL 與 type 不分大小寫;若 expr 過短,MySQL 會假設左側高位缺失(如 DAY_SECOND 給 "1:10" 視同 MINUTE_SECOND)。

天數轉換:TO_DAYS / FROM_DAYS

  • TO_DAYS(date):日期轉為第 0 年起算的天數(不適用 1582 年格里曆前)。
  • FROM_DAYS(N):天數轉回 DATE。

格式化輸出:DATE_FORMAT / TIME_FORMAT

常用格式符號:

符號意義範例輸出
%Y4 位年1997
%y2 位年97
%M月份全名January
%b月份縮寫Jan
%m月份 01-1201
%d日期 01-3104
%H24 制時 00-2322
%h/%I12 制時 01-1210
%i分鐘 00-5923
%s/%S秒 00-5900
%T24 制時間 hh:mm:ss22:23:00
%r12 制時間 hh:mm:ss AM/PM10:23:00 PM
%W星期全名Saturday
%a星期縮寫Sat
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() / SYSDATE() / CURRENT_TIMESTAMP:回傳 YYYY-MM-DD HH:MM:SS 或數值 YYYYMMDDHHMMSS。
  • CURDATE() / CURRENT_DATE:回傳今日日期。
  • CURTIME() / CURRENT_TIME:回傳當前時間。

Unix 時間戳轉換

  • UNIX_TIMESTAMP([date]):無參數回傳當前秒數;有參數轉換指定日期時間為秒數(自 1970-01-01 UTC)。
  • FROM_UNIXTIME(unix_timestamp[,format]):秒數轉回日期時間字串,可加格式化參數(同 DATE_FORMAT)。
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(seconds):秒數 → HH:MM:SS。
  • TIME_TO_SEC(time):時間 → 總秒數。
SELECT SEC_TO_TIME(2378);     -- 00:39:38
SELECT TIME_TO_SEC('22:23:00'); -- 80580

實戰技巧:查詢最近 30 天資料

SELECT * FROM `table`
WHERE TO_DAYS(NOW()) - TO_DAYS(`date_col`) <= 30;

善用這些函數,能讓 SQL 查詢更簡潔、效能更佳。建議搭配索引設計(如對日期欄建立索引),避免在 WHERE 條件中對欄位使用函數導致索引失效。

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