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

MySQL 日期時間函數完全速查手冊:從提取到運算到格式化

     編輯:MySQL 資料庫相關知識

一、日期部份提取

函數回傳值範例結果
DAYOFWEEK(d)1=週日 ... 7=週六DAYOFWEEK('1998-02-03')3
WEEKDAY(d)0=週一 ... 6=週日WEEKDAY('1997-10-04')5
DAYOFMONTH(d)1-31DAYOFMONTH('1998-02-03')3
DAYOFYEAR(d)1-366DAYOFYEAR('1998-02-03')34
MONTH(d)1-12MONTH('1998-02-03')2
DAYNAME(d)英文星期名DAYNAME('1998-02-05')Thursday
MONTHNAME(d)英文月份名MONTHNAME('1998-02-05')February
QUARTER(d)1-4QUARTER('98-04-01')2
WEEK(d[,mode])週數 0-53WEEK('1998-02-20',1)8
YEAR(d)1000-9999YEAR('98-02-03')1998
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

二、日期運算:DATE_ADD / DATE_SUB / ADDDATE / SUBDATE

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

unit 關鍵字與 expr 格式對照:

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

常用範例

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-01', INTERVAL 31 DAY);           -- 1997-12-01
SELECT DATE_ADD('1998-01-30', INTERVAL 1 MONTH);          -- 1998-02-28 (月末自動調整)

三、EXTRACT 提取複合部份

SELECT EXTRACT(YEAR_MONTH FROM '1999-07-02 01:02:03');  -- 199907
SELECT EXTRACT(DAY_MINUTE FROM '1999-07-02 01:02:03');  -- 20102 (02日 01:02)

四、天數轉換:TO_DAYS / FROM_DAYS

SELECT TO_DAYS('1997-10-07');    -- 729669 (從公元 0 年起算天數)
SELECT FROM_DAYS(729669);        -- '1997-10-07'

⚠️ 僅適用格里曆(1582 年後)。

五、格式化輸出:DATE_FORMAT / TIME_FORMAT

修飾符含義範例輸出
%Y4 位年1997
%y2 位年97
%m月 01-1210
%c月 1-1210
%d日 01-3104
%e日 1-314
%H時 00-2322
%k時 0-2322
%h/%I時 01-1210
%i分 00-5923
%s/%S秒 00-5900
%W星期全名Saturday
%a星期縮寫Sat
%M月份全名October
%b月份縮寫Oct
%r12h 時間10:23:00 PM
%T24h 時間22:23:00
%pAM/PMPM
%j年內天數 001-366277
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 / CURDATE / CURTIME

SELECT NOW();           -- '1997-12-15 23:50:26'
SELECT CURDATE();       -- '1997-12-15'
SELECT CURTIME();       -- '23:50:26'
-- 數字語境下自動轉為數值:NOW()+0 = 19971215235026

七、Unix 時間戳互轉:UNIX_TIMESTAMP / FROM_UNIXTIME


SELECT UNIX_TIMESTAMP();                    -- 882226357 (秒)
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 / TIME_TO_SEC


SELECT SEC_TO_TIME(2378);   -- '00:39:38'
SELECT TIME_TO_SEC('22:23:00'); -- 80580

實戰技巧

  • 本週一 00:00:00:DATE_SUB(CURDATE(), INTERVAL WEEKDAY(CURDATE()) DAY)
  • 本月第一天:DATE_SUB(CURDATE(), INTERVAL DAYOFMONTH(CURDATE())-1 DAY)
  • 上月同期:DATE_SUB(NOW(), INTERVAL 1 MONTH)
  • 年齡計算:FLOOR(DATEDIFF(CURDATE(), birth) / 365.25)
  • 時區轉換:CONVERT_TZ(dt, 'UTC', 'Asia/Taipei')(需載入時區表)。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved