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

MySQLで1週間より古い行を抽出するクエリの書き方

MySQLで「現在日時から1週間以上前」のレコードを取得したい場合、DATEDIFF() 関数を使うのが便利です。DATEDIFF() は2つの日付の差を日数で返す関数で、これを WHERE 句と組み合わせることで、指定した期間より古い行を簡単に絞り込めます。

前提:現在の日時を確認する

まず、NOW() 関数で現在の日時を確認しておきましょう。

mysql> select now();
+---------------------+
| now()               |
+---------------------+
| 2019-06-09 19:15:56 |
+---------------------+
1 row in set (0.00 sec)

サンプルテーブルの作成

動作確認のため、出荷日(ShippingDate)を格納するテーブルを作成します。

mysql> create table DemoTable
   -> (
   -> ShippingDate datetime
   -> );
Query OK, 0 rows affected (0.66 sec)

テストデータの挿入

INSERT 文を使って、いくつかのレコードを登録します。

mysql> insert into DemoTable values('2019-06-01');
Query OK, 1 row affected (0.19 sec)

mysql> insert into DemoTable values('2019-06-02');
Query OK, 1 row affected (0.21 sec)

mysql> insert into DemoTable values('2019-06-14');
Query OK, 1 row affected (0.18 sec)

mysql> insert into DemoTable values('2019-05-21');
Query OK, 1 row affected (0.24 sec)

登録済みデータの確認

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

mysql> select *from DemoTable;

実行結果

+---------------------+
| ShippingDate        |
+---------------------+
| 2019-06-01 00:00:00 |
| 2019-06-02 00:00:00 |
| 2019-06-14 00:00:00 |
| 2019-05-21 00:00:00 |
+---------------------+
4 rows in set (0.00 sec)

1週間より古い行を抽出するクエリ

ここでは現在日を「2019-06-09」とします。この場合、「1週間より古い行」とは「2019-06-02 より前の日付」のレコードを指します。次のように DATEDIFF() を使った条件を WHERE 句に指定します。

mysql> select *from DemoTable where DATEDIFF(now(),ShippingDate) > 7;

実行結果

+---------------------+
| ShippingDate        |
+---------------------+
| 2019-06-01 00:00:00 |
| 2019-05-21 00:00:00 |
+---------------------+
2 rows in set (0.00 sec)

解説

DATEDIFF(now(), ShippingDate) は「現在日時から出荷日を引いた日数」を返します。この値が 7より大きい 場合、そのレコードは1週間以上前のものであると判断できます。

なお、同様の処理は以下のような書き方でも実現可能です。

  • NOW() - INTERVAL 7 DAY: 「NOW() < DATE_SUB(NOW(), INTERVAL 7 DAY)」のように、基準日を先に計算して比較する方法。
  • CURDATE() の利用: 時刻情報が不要な場合は CURDATE() を使うことで、日付単位での比較が可能です。

大量のデータを扱う場合は、ShippingDate 列にインデックスを作成しておくと、検索パフォーマンスの向上が期待できます。

  1. MySQLでLIMITとOFFSETを使って1バッチずつ行を取得する方法

    LIMITとOFFSETによるバッチ取得の基本MySQLで大量のデータを少しずつ処理したい場合、LIMIT句とOFFSET句を組み合わせるのが定番の手法です。LIMITは取得する行数を指定し、OFFSETは先頭から読み飛ばす行数を指定します。この2つを活用することで、テーブルの行を1バッチずつ順番に取り出せます。まずは、動作確認用のサンプルテーブルを作成しましょう。mysql> create table DemoTable1514    -> (    -> Id int NOT NULL AUTO_INCREMENT PRIMARY

  2. MySQLで1日より古いタイムスタンプの行を取得する方法

    MySQLで1日より古いタイムスタンプの行を取得する方法MySQLで、1日より古いタイムスタンプで更新された行を取得したい場合は、from_unixtime()関数とnow()関数を組み合わせて使用します。from_unixtime()はUNIXタイムスタンプを日時形式に変換する関数で、now()は現在の日時を返します。これらを組み合わせることで、指定した期間より古いレコードを簡単に抽出できます。それでは、実際にテーブルを作成して動作を確認していきましょう。テーブルの作成まず、サンプルデータを格納するテーブルを作成します。mysql> create table demo75 -&g