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

【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 MONTHINTERVAL 1 DAYのように単位を変更するだけで対応可能です。ログの古いデータ削除や期限切れレコードの一覧表示など、日常的な運用で非常に役立つテクニックなので、ぜひ覚えておきましょう。

  1. MySQLでタイムスタンプが5分より古いレコードを削除する方法

    MySQLでは、DELETE文とNOW()関数、INTERVAL演算子を組み合わせることで、指定した時間より古いレコードを簡単に削除できます。この記事では、タイムスタンプが現在時刻から5分より古いレコードを削除する具体的な手順を、サンプルコード付きで解説します。 1. サンプルテーブルの作成 まず、動作を確認するためのテーブルを作成します。ここではDATETIME型のカラムを持つシンプルなテーブルを用意しましょう。 mysql> create table DemoTable1851 ( DueDate datetime ); Query OK, 0 rows a

  2. 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)