DATE_ADD / DATEDIFF
| 対応: | MySQL 拡張 |
|---|
日付・日時に対して期間を加算・減算したり、2つの日付の差を求めたりする関数です。
構文
日付に期間を加算します(MySQL)。
SELECT DATE_ADD(日付, INTERVAL 値 単位);
日付から期間を減算します(MySQL)。
SELECT DATE_SUB(日付, INTERVAL 値 単位);
2つの日付の差(日数)を取得します(MySQL)。
SELECT DATEDIFF(日付1, 日付2);
2つの日付・時刻の差を取得します(PostgreSQL)。
SELECT AGE(日付1, 日付2);
構文一覧
| 構文 | 概要 |
|---|---|
| DATE_ADD(日付, INTERVAL 値 単位) | 指定した日付に期間を加算した日付を返します(MySQL)。 |
| DATE_SUB(日付, INTERVAL 値 単位) | 指定した日付から期間を減算した日付を返します(MySQL)。 |
| INTERVAL 値 単位 | 期間を表す式です。単位には DAY・MONTH・YEAR・HOUR・MINUTE・SECOND などが使用できます。 |
| DATEDIFF(日付1, 日付2) | 日付1から日付2を引いた日数を返します(MySQL)。 |
| AGE(日付1, 日付2) | 2つの日付の差を年・月・日の形式で返します(PostgreSQL)。 |
サンプルコード
以下の『orders』テーブルと『members』テーブルを例に説明します。
今日から30日後の日付を取得します。
sample_date_add_datediff.sql
SELECT DATE_ADD(CURRENT_DATE, INTERVAL 30 DAY) AS deadline;
+------------+ | deadline | +------------+ | 2026-04-15 | +------------+ 1 row in set
今日から3ヶ月前の日付を取得します。
sample_date_add_datediff.sql
SELECT DATE_SUB(CURRENT_DATE, INTERVAL 3 MONTH) AS three_months_ago;
+------------------+ | three_months_ago | +------------------+ | 2025-12-16 | +------------------+ 1 row in set
注文日から7日後の配送予定日を算出します。
sample_date_add_datediff.sql
SELECT order_id, order_date,
DATE_ADD(order_date, INTERVAL 7 DAY) AS estimated_delivery
FROM orders;
+----------+------------+--------------------+ | order_id | order_date | estimated_delivery | +----------+------------+--------------------+ | 1 | 2025-09-01 | 2025-09-08 | | 2 | 2025-10-05 | 2025-10-12 | | 3 | 2025-10-15 | 2025-10-22 | +----------+------------+--------------------+ 3 rows in set
登録日から今日までの経過日数を取得します。
sample_date_add_datediff.sql
SELECT member_id, name,
DATEDIFF(CURRENT_DATE, registered_at) AS days_since_joined
FROM members;
+-----------+----------+-------------------+ | member_id | name | days_since_joined | +-----------+----------+-------------------+ | 1 | 狡噛慎也 | 519 | | 2 | 常守朱 | 276 | +-----------+----------+-------------------+ 2 rows in set
30日以上前の注文を取得します。
sample_date_add_datediff.sql
SELECT order_id, order_date FROM orders WHERE order_date <= DATE_SUB(CURRENT_DATE, INTERVAL 30 DAY);
+----------+------------+ | order_id | order_date | +----------+------------+ | 1 | 2025-09-01 | | 2 | 2025-10-05 | | 3 | 2025-10-15 | +----------+------------+ 3 rows in set
データベース別の書き方
MySQL / MariaDB
『DATE_ADD』『DATE_SUB』『DATEDIFF』がすべて使用できます。
SELECT DATE_ADD(CURRENT_DATE, INTERVAL 30 DAY) AS deadline; SELECT DATE_SUB(CURRENT_DATE, INTERVAL 3 MONTH) AS three_months_ago; SELECT DATEDIFF(CURRENT_DATE, registered_at) AS days_since_joined FROM members;
PostgreSQL
PostgreSQL では『+ INTERVAL』演算子で日付の加算ができます。日付の差は引き算で求めます。
SELECT CURRENT_DATE + INTERVAL '30 days' AS deadline; SELECT CURRENT_DATE - registered_at AS days_since_joined FROM members; SELECT AGE(CURRENT_DATE, registered_at) FROM members;
SQLite
SQLite では『date』関数に修飾子を付けて計算します。
SELECT date('now', '+30 days') AS deadline;
SELECT date('now', '-3 months') AS three_months_ago;
概要
『DATE_ADD』と『DATE_SUB』はMySQL固有の関数ですが、標準SQLの『+ INTERVAL』構文(例:『order_date + INTERVAL '7' DAY』)を使うとPostgreSQLでも動作します。移植性を重視する場合は標準SQLの書き方を選ぶとよいでしょう。
『DATEDIFF(日付1, 日付2)』はMySQLでは日付1 − 日付2の日数を返します。PostgreSQLでは『日付1 - 日付2』と引き算の演算子で整数の日数差を求めることができます。
現在の日付・日時を取得するには『CURRENT_DATE / NOW』を、日付から年月日などの要素を取り出すには『EXTRACT / FORMAT』を参照してください。
記事の間違いや著作権の侵害等ございましたらお手数ですがこちらまでご連絡頂ければ幸いです。