這些函數執行日期運算。 date 是一個 DATETIME 或DATE值,用來指定起始時間。 expr 是一個表達式,用來指定從起始日期添加或減去的時間間隔值。 Expr是一個字符串;對於負值的時間間隔,它可以以一個 ‘-'開頭。 type 為關鍵詞,它指示了表達式被解釋的方式。
關鍵詞INTERVA及 type 分類符均不區分大小寫。
以下表顯示了type 和expr 參數的關系:
type 值
預期的 expr 格式
MICROSECOND
MICROSECONDS
SECOND
SECONDS
MINUTE
MINUTES
HOUR
HOURS
DAY
DAYS
WEEK
WEEKS
MONTH
MONTHS
QUARTER
QUARTERS
YEAR
YEARS
SECOND_MICROSECOND
'SECONDS.MICROSECONDS'
MINUTE_MICROSECOND
'MINUTES.MICROSECONDS'
MINUTE_SECOND
'MINUTES:SECONDS'
HOUR_MICROSECOND
'HOURS.MICROSECONDS'
HOUR_SECOND
'HOURS:MINUTES:SECONDS'
HOUR_MINUTE
'HOURS:MINUTES'
DAY_MICROSECOND
'DAYS.MICROSECONDS'
DAY_SECOND
'DAYS HOURS:MINUTES:SECONDS'
DAY_MINUTE
'DAYS HOURS:MINUTES'
DAY_HOUR
'DAYS HOURS'
YEAR_MONTH
'YEARS-MONTHS'
MySQL 允許任何expr 格式中的標點分隔符。表中所顯示的是建議的 分隔符。若 date 參數是一個 DATE 值,而你的計算只會包括 YEAR、MONTH和DAY部分(即, 沒有時間部分), 其結果是一個DATE 值。否則,結果將是一個 DATETIME值。
若位於另一端的表達式是一個日期或日期時間值 , 則INTERVAL expr type只允許在 + 操作符的兩端。對於 –操作符, INTERVAL expr type 只允許在其右端,原因是從一個時間間隔中提取一個日期或日期時間值是毫無意義的。 (見下面的例子)。
mysql> SELECT '1997-12-31 23:59:59' + INTERVAL 1 SECOND;
-> '1998-01-01 00:00:00'
mysql> SELECT INTERVAL 1 DAY + '1997-12-31';
-> '1998-01-01'
mysql> SELECT '1998-01-01' - INTERVAL 1 SECOND;
-> '1997-12-31 23:59:59'
mysql> SELECT DATE_ADD('1997-12-31 23:59:59',
-> INTERVAL 1 SECOND);
-> '1998-01-01 00:00:00'
mysql> SELECT DATE_ADD('1997-12-31 23:59:59',
-> INTERVAL 1 DAY);
-> '1998-01-01 23:59:59'
mysql> SELECT DATE_ADD('1997-12-31 23:59:59',
-> INTERVAL '1:1' MINUTE_SECOND);
-> '1998-01-01 00:01:00'
mysql> SELECT DATE_SUB('1998-01-01 00:00:00',
-> INTERVAL '1 1:1:1' DAY_SECOND);
-> '1997-12-30 22:58:59'
mysql> SELECT DATE_ADD('1998-01-01 00:00:00',
-> INTERVAL '-1 10' DAY_HOUR);
-> '1997-12-30 14:00:00'
mysql> SELECT DATE_SUB('1998-01-02', INTERVAL 31 DAY);
-> '1997-12-02'
mysql> SELECT DATE_ADD('1992-12-31 23:59:59.000002',
-> INTERVAL '1.999999' SECOND_MICROSECOND);
-> '1993-01-01 00:00:01.000001'
若你指定了一個過於短的時間間隔值 (不包括type 關鍵詞所預期的所有時間間隔部分), MySQL 假定你已經省去了時間間隔值的最左部分。 例如,你指定了一種類型的DAY_SECOND, expr 的值預期應當具有天、 小時、分鐘和秒部分。若你指定了一個類似 '1:10'的值, MySQL 假定天和小時部分不存在,那麼這個值代表分和秒。換言之, '1:10' DAY_SECOND 被解釋為相當於 '1:10' MINUTE_SECOND。這相當於 MySQL將TIME 值解釋為所耗費的時間而不是日時的解釋方式。
假如你對一個日期值添加或減去一些含有時間部分的內容,則結果自動轉化為一個日期時間值:
mysql> SELECT DATE_ADD('1999-01-01', INTERVAL 1 DAY);
-> '1999-01-02'
mysql> SELECT DATE_ADD('1999-01-01', INTERVAL 1 HOUR);
-> '1999-01-01 01:00:00'
假如你使用了格式嚴重錯誤的日期,則結果為 NULL。假如你添加了 MONTH、YEAR_MONTH或YEAR ,而結果日期中有一天的日期大於添加的月份的日期最大限度,則這個日期自動被調整為添加月份的最大日期:
mysql> SELECT DATE_ADD('1998-01-30', INTERVAL 1 MONTH);
-> '1998-02-28'
根據format 字符串安排date 值的格式。
以下說明符可用在 format 字符串中:
說明符
說明
%a
工作日的縮寫名稱 (Sun..Sat)
%b
月份的縮寫名稱 (Jan..Dec)
%c
月份,數字形式(0..12)
%D
帶有英語後綴的該月日期 (0th, 1st, 2nd, 3rd, ...)
%d
該月日期, 數字形式 (00..31)
%e
該月日期, 數字形式(0..31)
%f
微秒 (000000..999999)
%H
小時(00..23)
%h
小時(01..12)
%I
小時 (01..12)
%i
分鐘,數字形式 (00..59)
%j
一年中的天數 (001..366)
%k
小時 (0..23)
%l
小時 (1..12)
%M
月份名稱 (January..December)
%m
月份, 數字形式 (00..12)
%p
上午(AM)或下午( PM)
%r
時間 , 12小時制 (小時hh:分鐘mm:秒數ss 後加 AM或PM)
%S
秒 (00..59)
%s
秒 (00..59)
%T
時間 , 24小時制 (小時hh:分鐘mm:秒數ss)
%U
周 (00..53), 其中周日為每周的第一天
%u
周 (00..53), 其中周一為每周的第一天
%V
周 (01..53), 其中周日為每周的第一天 ; 和 %X同時使用
%v
周 (01..53), 其中周一為每周的第一天 ; 和 %x同時使用
%W
工作日名稱 (周日..周六)
%w
一周中的每日 (0=周日..6=周六)
%X
該周的年份,其中周日為每周的第一天, 數字形式,4位數;和%V同時使用
%x
該周的年份,其中周一為每周的第一天, 數字形式,4位數;和%v同時使用
%Y
年份, 數字形式,4位數
%y
年份, 數字形式 (2位數)
%%
‘%'文字字符
所有其它字符都被復制到結果中,無需作出解釋。
注意, ‘%'字符要求在格式指定符之前。
月份和日期說明符的范圍從零開始,原因是 MySQL允許存儲諸如 '2004-00-00'的不完全日期.
mysql> SELECT DATE_FORMAT('1997-10-04 22:23:00', '%W %M %Y');
-> 'Saturday October 1997'
mysql> SELECT DATE_FORMAT('1997-10-04 22:23:00', '%H:%i:%s');
-> '22:23:00'
mysql> SELECT DATE_FORMAT('1997-10-04 22:23:00',
'%D %y %a %d %m %b %j');
-> '4th 97 Sat 04 10 Oct 277'
mysql> SELECT DATE_FORMAT('1997-10-04 22:23:00',
'%H %k %I %r %T %S %w');
-> '22 22 10 10:23:00 PM 22:23:00 00 6'
mysql> SELECT DATE_FORMAT('1999-01-01', '%X %V');
-> '1998 52'