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

MySQL 日期時間函數大全:從基礎提取到複雜運算的完整參考

     編輯:MySQL 資料庫相關知識

MySQL 日期時間函數完整手冊(上)

系統整理 MySQL 核心日期時間函數,涵蓋提取、運算、格式化、區間計算四大類,附帶實測示例與版本差異說明。

一、日期提取函數

函數返回值示例結果
DAYOFWEEK(d)星期索引 (1=周日..7=周六)DAYOFWEEK('1998-02-03')3
WEEKDAY(d)星期索引 (0=周一..6=周日)WEEKDAY('1998-02-03')1
DAYOFMONTH(d)月內第幾天 (1-31)DAYOFMONTH('1998-02-03')3
DAYOFYEAR(d)年內第幾天 (1-366)DAYOFYEAR('1998-02-03')34
MONTH(d)月份 (1-12)MONTH('1998-02-03')2
DAYNAME(d)星期名DAYNAME('1998-02-05')Thursday
MONTHNAME(d)月份名MONTHNAME('1998-02-05')February
QUARTER(d)季度 (1-4)QUARTER('98-04-01')2
YEAR(d)年份 (1000-9999)YEAR('98-02-03')1998

二、周計算函數:WEEK() 與 YEARWEEK()

WEEK(date[, mode])
YEARWEEK(date[, mode])

mode 參數詳解:

mode周起始日返回範圍備註
0周日0-53美式習慣
1周一0-53
2周日1-53
3周一1-53ISO 8601 標準

關鍵行為差異

  • WEEK('2000-01-01', 0) → 0(屬於上一年最後一周)
  • WEEK('2000-01-01', 2) → 52(ISO 模式歸屬上年)
  • YEARWEEK('2000-01-01') → 199952(年周組合,避免歧義)

建議:跨年周計算統一使用 mode=3 (ISO 8601) 或 YEARWEEK(),避免業務邏輯錯誤。

三、時間提取函數

函數返回範圍示例
HOUR(t)0-23HOUR('10:05:03') → 10
MINUTE(t)0-59MINUTE('98-02-03 10:05:03') → 5
SECOND(t)0-59SECOND('10:05:03') → 3

四、期間運算:PERIOD_ADD / PERIOD_DIFF

  • 參數格式:YYMM 或 YYYYMM(非日期類型)
  • PERIOD_ADD(9801, 2) → 199803(加 2 月)
  • PERIOD_DIFF(9802, 199703) → 11(月數差)

五、日期算術:DATE_ADD / DATE_SUB / ADDDATE / SUBDATE

DATE_ADD(date, INTERVAL expr type)
DATE_SUB(date, INTERVAL expr type)

type 與 expr 格式對應表:

typeexpr 格式示例
SECONDSECONDSINTERVAL 1 SECOND
MINUTEMINUTESINTERVAL 5 MINUTE
HOURHOURSINTERVAL 2 HOUR
DAYDAYSINTERVAL 10 DAY
MONTHMONTHSINTERVAL 3 MONTH
YEARYEARSINTERVAL 1 YEAR
MINUTE_SECOND"MINUTES:SECONDS"INTERVAL "5:30" MINUTE_SECOND
HOUR_MINUTE"HOURS:MINUTES"INTERVAL "2:30" HOUR_MINUTE
DAY_HOUR"DAYS HOURS"INTERVAL "3 5" DAY_HOUR
YEAR_MONTH"YEARS-MONTHS"INTERVAL "1-6" YEAR_MONTH
HOUR_SECOND"HOURS:MINUTES:SECONDS"INTERVAL "1:30:45" HOUR_SECOND
DAY_MINUTE"DAYS HOURS:MINUTES"INTERVAL "2 12:30" DAY_MINUTE
DAY_SECOND"DAYS HOURS:MINUTES:SECONDS"INTERVAL "1 2:30:45" DAY_SECOND

實測示例

"1997-12-31 23:59:59" + INTERVAL 1 SECOND     → 1998-01-01 00:00:00
INTERVAL 1 DAY + "1997-12-31"                   → 1998-01-01
"1998-01-01" - INTERVAL 1 SECOND                → 1997-12-31 23:59:59
DATE_ADD("1997-12-31 23:59:59", INTERVAL 1 DAY) → 1998-01-01 23:59:59
DATE_ADD("1997-12-31 23:59:59", INTERVAL "1:1" MINUTE_SECOND) → 1998-01-01 00:01:00
DATE_SUB("1998-01-01 00:00:00", INTERVAL "1 1:1:1" DAY_SECOND) → 1997-12-30 22:58:59
DATE_ADD("1998-01-01 00:00:00", INTERVAL "-1 10" DAY_HOUR) → 1997-12-30 14:00:00
DATE_SUB("1998-01-02", INTERVAL 31 DAY)         → 1997-12-02

返回類型規則

  • 若 date 為 DATE 且間隔僅含 YEAR/MONTH/DAY → 返回 DATE
  • 否則返回 DATETIME
  • MySQL 3.23+ 支持 +/- 運算符簡寫(右操作數為日期/間隔)

六、實用查詢模式:近 30 天數據

SELECT * FROM tbl_name
WHERE TO_DAYS(NOW()) - TO_DAYS(date_col) <= 30;
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved