DATE_ADD(date,INTERVAL expr unit)

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 値であり、行う計算が YEARMONTH 、および DAY 部のみ ( 時刻部分はなし ) を含む場合は、結果は DATE 値になります。他の場合は、結果は DATETIME 値になります。

また、日付演算は、INTERVAL+ または - 演算子と共に使用しても行うことができます :

date + INTERVAL expr unit
date - INTERVAL expr 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_SECONDunit を指定した場合、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'

MONTHYEAR_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