首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

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

     編輯:MySQL 綜合教學

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

MySQL 提供豐富的日期時間函數族,涵蓋獲取、提取、計算、格式化、轉換、時區處理等全場景。本文系統整理官方文檔核心函數,附帶實戰示例,作為開發查閱手冊。

一、當前時間獲取

函數返回值示例
NOW() / SYSDATE() / CURRENT_TIMESTAMP()YYYY-MM-DD HH:MM:SS2014-10-29 10:52:57
CURDATE() / CURRENT_DATE()YYYY-MM-DD2014-10-29
CURTIME() / CURRENT_TIME()HH:MM:SS10:59:58
UTC_TIMESTAMP(), UTC_DATE(), UTC_TIME()UTC 時間本地時間 -8 小時

注意:NOW() 在語句開始時固定值;SYSDATE() 執行時動態取值。

二、日期時間組件提取

SET @dt = '2008-09-10 07:15:30.123456';
YEAR(@dt)        -- 2008
QUARTER(@dt)     -- 3
MONTH(@dt)       -- 9
WEEK(@dt)        -- 36 (模式 0: 週日起算)
DAY(@dt)         -- 10
HOUR(@dt)        -- 7
MINUTE(@dt)      -- 15
SECOND(@dt)      -- 30
MICROSECOND(@dt) -- 123456
DAYNAME(@dt)     -- Wednesday
MONTHNAME(@dt)   -- September

EXTRACT(unit FROM date) 通用提取函數,支持組合單位:YEAR_MONTH、DAY_HOUR、HOUR_SECOND 等。

三、星期與周計算

  • DAYOFWEEK():1=週日 ... 7=週六 (ODBC 標準)
  • WEEKDAY():0=週一 ... 6=週日
  • WEEK(date, mode):mode=0 週日起算,mode=1 週一起算
  • WEEKOFYEAR() = WEEK(date,3)
  • YEARWEEK():返回 年+周 如 200831

四、日期時間加減運算

DATE_ADD(date, INTERVAL expr unit)
DATE_SUB(date, INTERVAL expr unit)
-- 支持單位:SECOND, MINUTE, HOUR, DAY, WEEK, MONTH, QUARTER, YEAR
-- 組合單位:MINUTE_SECOND, HOUR_MINUTE, DAY_HOUR, YEAR_MONTH, 
--           HOUR_SECOND, DAY_MINUTE, DAY_SECOND

SELECT DATE_ADD('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:1' MINUTE_SECOND); -- 1998-01-01 00:01:00
SELECT DATE_SUB('1998-01-01 00:00:00', INTERVAL '1 1:1:1' DAY_SECOND); -- 1997-12-30 22:58:59

五、日期差值計算

  • DATEDIFF(date1, date2):返回天數差 (date1 - date2)
  • TIMEDIFF(time1, time2):返回時間差 (time1 - time2),參數類型必須一致
  • TIMESTAMPDIFF(unit, datetime1, datetime2):按指定單位計算差值,功能更強

六、格式化與解析

DATE_FORMAT(date, format)  -- 日期→字符串
TIME_FORMAT(time, format)  -- 時間→字符串
STR_TO_DATE(str, format)   -- 字符串→日期
-- 常用格式符:
-- %Y 4位年 %y 2位年 %m 月(01-12) %c 月(1-12)
-- %d 日(01-31) %e 日(1-31) %D 英文後綴(1st,2nd)
-- %H 時(00-23) %h/%I 時(01-12) %k 時(0-23) %l 時(1-12)
-- %i 分(00-59) %S/%s 秒(00-59) %f 微秒
-- %W 週名 %a 週名縮寫 %w 週幾(0=週日)
-- %j 年內天數(001-366) %U/%u 周數
-- %r 12小時制 %T 24小時制 %p AM/PM

七、時間戳與天數轉換

UNIX_TIMESTAMP() / UNIX_TIMESTAMP(date)     -- 日期→Unix秒數
FROM_UNIXTIME(unix_ts) / FROM_UNIXTIME(unix_ts, format) -- 秒數→日期
TO_DAYS(date)      -- 日期→紀元天數 (0000-00-00 起)
FROM_DAYS(days)    -- 天數→日期
TIME_TO_SEC(time)  -- 時間→總秒數
SEC_TO_TIME(sec)   -- 秒數→時間

八、時區轉換

CONVERT_TZ(dt, from_tz, to_tz)
SELECT CONVERT_TZ('2008-08-08 12:00:00', '+08:00', '+00:00'); -- 2008-08-08 04:00:00
-- 等價於 DATE_ADD(dt, INTERVAL -8 HOUR)

九、周期計算 (較少用)

PERIOD_ADD(P, N)    -- YYYYMM + N 月
PERIOD_DIFF(P1, P2) -- 月數差

十、構造日期時間

MAKEDATE(year, dayofyear)  -- 2001, 32 → '2001-02-01'
MAKETIME(hour, minute, second) -- 12,15,30 → '12:15:30'

十一、類型選擇建議

類型存儲范圍適用場景
DATETIME8 bytes1000-01-01 ~ 9999-12-31通用業務時間,無時區依賴
TIMESTAMP4 bytes1970-01-01 ~ 2038-01-19自動記錄創建/更新時間,跨時區應用
DATE3 bytes1000-01-01 ~ 9999-12-31純日期業務 (生日、合同日期)
TIME3 bytes-838:59:59 ~ 838:59:59時間間隔、每日定時任務
YEAR1 byte1901 ~ 2155年份標記

提示:MySQL 5.6.4+ 支持毫秒/微秒精度 (DATETIME(6)),舊版本僅支持秒級。

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