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;
用途に応じてこれらの書き方を使い分けると、柔軟な期間検索が実現できます。
-
MySQLのWHERE句で日付の差を計算して行を抽出する方法(TIMESTAMPDIFFの使い方)
MySQLでは、TIMESTAMPDIFF() 関数を使うことで、日時同士の差分を計算し、その結果に基づいてWHERE句で行を絞り込むことができます。ここでは、指定した日時との差が5分以内のレコードを抽出する例を紹介します。サンプルテーブルの作成まず、datetime型のカラムを持つテーブルを作成しましょう。mysql> create table demo42 -> ( -> start_date datetime -> ); Query OK, 0 rows affected (0.77 sec)テーブルへのデータ挿入次に、INSERT文を使っていくつかの日時データを
-
MySQLで条件を指定して日付の期間(間・前・後)を抽出する方法
MySQLでは、WHERE句にAND条件とOR条件を組み合わせることで、「ある日付より前」かつ「別のある日付より後、またはNULL」といった複雑な条件付きの日付抽出が可能になります。退職日(relieving_date)が未設定のレコードも含めて抽出したい場合などに特に便利です。 基本の構文 条件付きで日付を選択する場合の基本的な構文は以下の通りです。 SELECT * FROM テーブル名 WHERE カラム名1 < 値1 AND (カラム名2 > 値2 OR カラム名2 IS NULL); この構文のポイントは、OR条件部分を括弧()で囲むことです。これにより、AND条件との優