言語
日本語
English

Caution

お使いのブラウザはJavaScriptが無効になっております。
当サイトでは検索などの処理にJavaScriptを使用しています。
より快適にご利用頂くため、JavaScriptを有効にしたうえで当サイトを閲覧することをお勧めいたします。

  1. トップページ
  2. SQL辞典
  3. DATE_ADD / DATEDIFF

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』テーブルを例に説明します。

orders order_id order_date due_date 1 2025-09-01 2025-09-30 2 2025-10-05 2025-11-04 3 2025-10-15 2025-11-14 3 rows in set members member_id name registered_at 1 狡噛慎也 2024-10-15 2 常守朱 2025-06-15 2 rows in set

今日から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』を参照してください。

記事の間違いや著作権の侵害等ございましたらお手数ですがまでご連絡頂ければ幸いです。