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

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> insert into demo42 values('2020-01-10 12:30:05');
Query OK, 1 row affected (0.11 sec)

mysql> insert into demo42 values('2019-02-24 10:40:45');
Query OK, 1 row affected (0.11 sec)

mysql> insert into demo42 values('2020-05-12 05:45:55');
Query OK, 1 row affected (0.17 sec)

mysql> insert into demo42 values('2020-05-12 05:40:55');
Query OK, 1 row affected (0.15 sec)

mysql> insert into demo42 values('2020-05-12 05:42:55');
Query OK, 1 row affected (0.11 sec)

登録データの確認

SELECT文でテーブルの中身を確認してみましょう。

mysql> select * from demo42;

実行すると以下のような結果が表示されます。

+---------------------+
| start_date          |
+---------------------+
| 2020-01-10 12:30:05 |
| 2019-02-24 10:40:45 |
| 2020-05-12 05:45:55 |
| 2020-05-12 05:40:55 |
| 2020-05-12 05:42:55 |
+---------------------+
5 rows in set (0.00 sec)

TIMESTAMPDIFFを使って差分条件で行を選択する

ここからが本題です。基準となる日時「2020-05-12 05:40:55」と各レコードの start_date の差を分単位で求め、その絶対値が5未満である行だけを抽出します。

mysql> select * from demo42
-> where ABS(TIMESTAMPDIFF(MINUTE, start_date, '2020-05-12 05:40:55')) < 5;

クエリのポイント

  • TIMESTAMPDIFF(単位, 日時1, 日時2): 「日時2 − 日時1」の差を指定した単位(ここではMINUTE=分)で返します。
  • ABS(): 差分が負になる場合(過去の日時)でも正しく判定できるよう、絶対値を取っています。

このクエリを実行すると、次の出力が得られます。

+---------------------+
| start_date          |
+---------------------+
| 2020-05-12 05:40:55 |
| 2020-05-12 05:42:55 |
+---------------------+
2 rows in set (0.00 sec)

基準日時から5分以内にある2件のレコードだけが抽出されました。なお、「2020-05-12 05:45:55」は差がちょうど5分のため条件「< 5」には該当しません。5分以内も含めたい場合は、比較演算子を「<=」に変更してください。

このように TIMESTAMPDIFF() を活用すれば、「直近○分以内のログを取得したい」「特定時刻に近いレコードを検索したい」といった要件を簡単に実現できます。

  1. MySQLでWHERE IN句とNULLを組み合わせてレコードを取得する方法

    MySQLでは、WHERE IN句を使った検索時にNULL値を含む行も取得したいケースがあります。しかし、NULLは通常の比較演算子では正しく評価されないため、IS NULLを組み合わせる必要があります。本記事では、その具体的な方法をサンプルコードとともに解説します。基本の構文NULLを含めて検索する場合の基本的な構文は以下のとおりです。ポイントは、IN句の条件に加えて OR カラム名 IS NULL を追加することです。SELECT yourColumnName1, yourColumnName2, yourColumnName3, ... N FROM yourTabl

  2. MySQLでカンマ区切りの文字列から特定の値を検索・選択する方法

    カンマ区切りで保存された文字列の中に、特定の値が含まれているかを確認して行を抽出したい場合があります。そのようなときは、MySQLの FIND_IN_SET() 関数を使用すると便利です。FIND_IN_SET() は、第1引数に検索したい文字列、第2引数にカンマ区切りの文字列を指定し、見つかった位置(1始まり)を返します。見つからない場合は0が返されるため、「0より大きい」という条件と組み合わせることで、該当するレコードだけを取得できます。テーブルの作成まず、サンプル用のテーブルを作成しましょう。mysql> create table demo81 -> ( ->