DATE_ADD(date,INTERVAL expr unit)
, DATE_SUB(date,INTERVAL expr unit)
これらの関数は日付演算を行います。date
は、開始日を指定する DATETIME
または DATE
値です。 expr
は開始日に追加、または開始日から引かれる区間値を指定する表現です。expr
はストリングで、負のインターバルの場合は ‘-
’ で始まることがあります。unit
は、表現が解釈されるべきユニットを示すキーワードです。
INTERVAL
キーワードおよび unit
指定子は、大文字小文字の区別をしません。
次の表は、各 unit
値に対して予想される expr
引数のフォームを示したものです。
unit 値 |
予想される 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
を +
または -
演算子と共に使用しても行うことができます :
date
+ INTERVALexpr
unit
date
- INTERVALexpr
unit
INTERVAL expr unit
は、一方の表現が日付か日付時刻値であれば、どちら側の +
演算子でも使用できます。-
演算子に関しては、INTERVAL expr unit
は、インターバルから日付や日付日時値を摘出しても意味がないため、右側でのみ使用できます。
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'
短すぎる区間値を指定した場合 ( unit
キーワードから予想されるすべての区間部分は含みません ) 、MySQL は区間値の一番左の部分が放置されているものと想定します。例えば、DAY_SECOND
の unit
を指定した場合、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'
MONTH
、YEAR_MONTH
、または YEAR
を加え、結果の日付が新しい月の最大日数より大きな日を持つ場合、その日は新しい月の最大日数に調整されます。
mysql> SELECT DATE_ADD('1998-01-30', INTERVAL 1 MONTH);
-> '1998-02-28'
日付算術演算には完全な日付が必須であり、'2006-07-00'
のような不完全な日付や、誤った形の日付では正常に作動しません :
mysql>SELECT DATE_ADD('2006-07-00', INTERVAL 1 DAY);
-> NULL mysql>SELECT '2005-03-32' + INTERVAL 1 MONTH;
-> NULL