MySQL
 Computer >> コンピューター >  >> プログラミング >> MySQL

MySQLで30日間の範囲の日付データを抽出する方法

MySQLでは、NOW()関数とINTERVALを組み合わせた日付演算を使うことで、現在日を基準とした前後30日間の範囲にあるレコードを簡単に抽出できます。本記事では、基本的なSQL構文から実際のテーブルを作成して動作を確認するまでの手順を、具体例を交えてわかりやすく解説します。

基本となるSQL構文

30日間の範囲の日付を選択するには、減算・加算とINTERVALを組み合わせた算術演算を使用します。

基本の構文は以下の通りです。

SELECT * FROM テーブル名
WHERE 日付カラム名 > NOW() - INTERVAL 30 DAY
AND 日付カラム名 < NOW() + INTERVAL 30 DAY;

このクエリは、「現在時刻から30日前」以降かつ「現在時刻から30日後」までの日付を持つレコードをすべて取得します。NOW()は実行した瞬間の日時を返すため、常に現在日を基準とした範囲検索が可能です。

動作確認用テーブルの作成

実際の動きを確認するために、サンプルテーブルを作成しましょう。

mysql> CREATE TABLE selectDatesDemo (
    -> Id int NOT NULL AUTO_INCREMENT PRIMARY KEY,
    -> ArrivalDate datetime
    -> );
Query OK, 0 rows affected (0.77 sec)

Idは自動採番の主キー、ArrivalDateは到着日を格納するdatetime型のカラムです。

テストデータの挿入

次に、INSERT文を使って複数のレコードを挿入します。

mysql> INSERT INTO selectDatesDemo(ArrivalDate) VALUES('2019-01-10');
Query OK, 1 row affected (0.12 sec)
mysql> INSERT INTO selectDatesDemo(ArrivalDate) VALUES('2019-01-29');
Query OK, 1 row affected (0.21 sec)
mysql> INSERT INTO selectDatesDemo(ArrivalDate) VALUES('2019-02-13');
Query OK, 1 row affected (0.14 sec)
mysql> INSERT INTO selectDatesDemo(ArrivalDate) VALUES('2019-02-19');
Query OK, 1 row affected (0.14 sec)
mysql> INSERT INTO selectDatesDemo(ArrivalDate) VALUES('2018-02-13');
Query OK, 1 row affected (0.17 sec)
mysql> INSERT INTO selectDatesDemo(ArrivalDate) VALUES('2018-03-13');
Query OK, 1 row affected (0.19 sec)

意図的に異なる年月日のデータを混ぜることで、範囲外のレコードが正しく除外されることを確認できるようにしています。

登録データの確認

SELECT文ですべてのレコードを表示してみましょう。

mysql> SELECT * FROM selectDatesDemo;

実行結果は以下の通りです。

+----+---------------------+
| Id | ArrivalDate         |
+----+---------------------+
| 1  | 2019-01-10 00:00:00 |
| 2  | 2019-01-29 00:00:00 |
| 3  | 2019-02-13 00:00:00 |
| 4  | 2019-02-19 00:00:00 |
| 5  | 2018-02-13 00:00:00 |
| 6  | 2018-03-13 00:00:00 |
+----+---------------------+
6 rows in set (0.00 sec)

30日間の範囲で日付を抽出するクエリ

それでは、基準日の前後30日間に含まれる日付だけを抽出してみます。

mysql> SELECT * FROM selectDatesDemo
   -> WHERE ArrivalDate > NOW() - INTERVAL 30 DAY
   -> AND ArrivalDate < NOW() + INTERVAL 30 DAY;

実行日が2019年2月中旬だった場合の出力例は以下の通りです。

+----+---------------------+
| Id | ArrivalDate         |
+----+---------------------+
| 3  | 2019-02-13 00:00:00 |
| 4  | 2019-02-19 00:00:00 |
+----+---------------------+
2 rows in set (0.04 sec)

2018年の古いデータや30日より前に登録されたデータが除外され、条件に合致する2件のみが取得できています。

補足:別の書き方との使い分け

同じ結果は、BETWEEN句やDATE_SUB/DATE_ADD関数でも得られます。

-- BETWEEN句を使う方法
SELECT * FROM selectDatesDemo
WHERE ArrivalDate BETWEEN NOW() - INTERVAL 30 DAY AND NOW() + INTERVAL 30 DAY;

-- DATE_SUB / DATE_ADD関数を使う方法
SELECT * FROM selectDatesDemo
WHERE ArrivalDate > DATE_SUB(NOW(), INTERVAL 30 DAY)
AND ArrivalDate < DATE_ADD(NOW(), INTERVAL 30 DAY);

なお、「過去30日以内」のように片側の範囲だけでよい場合は、条件を一つに絞ります。

SELECT * FROM selectDatesDemo
WHERE ArrivalDate >= NOW() - INTERVAL 30 DAY;

用途に応じてこれらの書き方を使い分けると、柔軟な期間検索が実現できます。

  1. MySQLのWHERE句で日付の差を計算して行を抽出する方法(TIMESTAMPDIFFの使い方)

    MySQLでは、TIMESTAMPDIFF() 関数を使うことで、日時同士の差分を計算し、その結果に基づいてWHERE句で行を絞り込むことができます。ここでは、指定した日時との差が5分以内のレコードを抽出する例を紹介します。サンプルテーブルの作成まず、datetime型のカラムを持つテーブルを作成しましょう。mysql> create table demo42 -> ( -> start_date datetime -> ); Query OK, 0 rows affected (0.77 sec)テーブルへのデータ挿入次に、INSERT文を使っていくつかの日時データを

  2. MySQLで条件を指定して日付の期間(間・前・後)を抽出する方法

    MySQLでは、WHERE句にAND条件とOR条件を組み合わせることで、「ある日付より前」かつ「別のある日付より後、またはNULL」といった複雑な条件付きの日付抽出が可能になります。退職日(relieving_date)が未設定のレコードも含めて抽出したい場合などに特に便利です。 基本の構文 条件付きで日付を選択する場合の基本的な構文は以下の通りです。 SELECT * FROM テーブル名 WHERE カラム名1 < 値1 AND (カラム名2 > 値2 OR カラム名2 IS NULL); この構文のポイントは、OR条件部分を括弧()で囲むことです。これにより、AND条件との優