【MySQL】現在から1週間以上前の日付データを抽出するクエリの書き方
1週間より前のレコードを取得する基本構文
MySQLで「現在の日時から1週間以上前」のデータを抽出したい場合、NOW()関数とINTERVALを組み合わせるのが最もシンプルで確実な方法です。基本的な構文は以下のとおりです。
SELECT * FROM テーブル名 WHERE カラム名 < NOW() - INTERVAL 1 WEEK;
このクエリでは、指定したカラムの値が「現在日時から1週間前の時点」よりも小さい(=それ以前の)レコードだけが返されます。
動作確認用テーブルの作成
実際にどのように動作するのか、サンプルテーブルを作成して確認してみましょう。まずはテーブルを作成します。
mysql> CREATE TABLE DatesOfOneWeek
-> (
-> ArrivalTime DATETIME
-> );
Query OK, 0 rows affected (0.87 sec)テストデータの挿入
次に、さまざまなパターンの日付データを挿入します。未来の日付、過去の日付、そしてDATE_ADD()を使って現在日時を基準に計算した値を混ぜて登録しています。
mysql> INSERT INTO DatesOfOneWeek VALUES(DATE_ADD(NOW(), INTERVAL 2 WEEK));
Query OK, 1 row affected (0.11 sec)
mysql> INSERT INTO DatesOfOneWeek VALUES('2018-11-04');
Query OK, 1 row affected (0.14 sec)
mysql> INSERT INTO DatesOfOneWeek VALUES('2018-11-25');
Query OK, 1 row affected (0.11 sec)
mysql> INSERT INTO DatesOfOneWeek VALUES(DATE_ADD(NOW(), INTERVAL -1 WEEK));
Query OK, 1 row affected (0.14 sec)
mysql> INSERT INTO DatesOfOneWeek VALUES(DATE_ADD(NOW(), INTERVAL 1 WEEK));
Query OK, 1 row affected (0.11 sec)データが正しく登録されているか、全件を表示して確認します。
mysql> SELECT * FROM DatesOfOneWeek;
実行結果は以下のとおりです。
+---------------------+ | ArrivalTime | +---------------------+ | 2018-12-20 18:11:02 | | 2018-11-04 00:00:00 | | 2018-11-25 00:00:00 | | 2018-11-29 18:11:40 | | 2018-12-13 18:11:46 | +---------------------+ 5 rows in set (0.00 sec)
1週間より前のレコードを抽出するクエリ
それでは本題です。現在日時から1週間より前(過去)の日付を持つレコードのみを抽出するには、次のようなクエリを実行します。
mysql> SELECT * FROM DatesOfOneWeek WHERE ArrivalTime < NOW() - INTERVAL 1 WEEK;
実行結果は以下のとおりです。
+---------------------+ | ArrivalTime | +---------------------+ | 2018-11-04 00:00:00 | | 2018-11-25 00:00:00 | | 2018-11-29 18:11:40 | +---------------------+ 3 rows in set (0.00 sec)
解説とポイント
結果を見ると、5件中3件が抽出されました。これは、基準時点である「NOW() - 1週間」より前に該当するレコードだけが返されたためです。DATE_ADD(NOW(), INTERVAL 2 WEEK)やDATE_ADD(NOW(), INTERVAL 1 WEEK)で登録した未来の日付は、条件に合致しないため除外されています。
- NOW() - INTERVAL 1 WEEK:現在日時からちょうど1週間前の時刻を表します。
- <(未満)演算子:厳密に1週間前の時刻そのものは含まれません。境界も含めたい場合は
<=を使用してください。 - インデックスの活用:対象カラムにインデックスが張られていれば、大量データでも高速に検索できます。
なお、「1か月前」「1日前」など期間を変えたい場合は、INTERVAL 1 MONTHやINTERVAL 1 DAYのように単位を変更するだけで対応可能です。ログの古いデータ削除や期限切れレコードの一覧表示など、日常的な運用で非常に役立つテクニックなので、ぜひ覚えておきましょう。
-
MySQLでタイムスタンプが5分より古いレコードを削除する方法
MySQLでは、DELETE文とNOW()関数、INTERVAL演算子を組み合わせることで、指定した時間より古いレコードを簡単に削除できます。この記事では、タイムスタンプが現在時刻から5分より古いレコードを削除する具体的な手順を、サンプルコード付きで解説します。 1. サンプルテーブルの作成 まず、動作を確認するためのテーブルを作成します。ここではDATETIME型のカラムを持つシンプルなテーブルを用意しましょう。 mysql> create table DemoTable1851 ( DueDate datetime ); Query OK, 0 rows a
-
MySQLのDELETE文とIN句を組み合わせて1つのクエリで複数レコードを削除する方法
MySQLでは、IN()句を活用することで、複数の条件値に一致するレコードを1つのDELETEクエリでまとめて削除できます。個別に削除クエリを実行する必要がなく、効率的なデータ操作が可能になります。ここでは、サンプルテーブルを作成し、実際にIN()句を使ったレコード削除の手順を解説します。1. サンプルテーブルの作成まず、テーブルを作成しましょう。mysql> create table DemoTable1922 ( StudentId int NOT NULL AUTO_INCREMENT PRIMARY KEY, StudentName varchar(20)