- DATE_ADD(date,INTERVAL expr type) DATE_SUB(date,INTERVAL expr type)
這些函數執行日期運算。 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'