MySQLで現在時刻から10分以内のレコードをすべて取得する方法
MySQLでは、DATE_SUB()関数とNOW()関数を組み合わせることで、現在のタイムスタンプから10分以内のレコードを簡単に抽出できます。この記事では、具体的なSQL構文と実行例を通じて、その方法をわかりやすく解説します。
基本となるSQL構文
現在の時刻から10分以内のレコードを取得するには、以下のような構文を使用します。
SELECT * FROM yourTableName WHERE yourColumnName >= DATE_SUB(NOW(), INTERVAL 10 MINUTE);
このクエリのポイントは、DATE_SUB(NOW(), INTERVAL 10 MINUTE)によって「現在時刻から10分前」の時刻を算出し、対象カラムの値がその時刻以降であるかを条件として絞り込んでいる点です。
動作確認用テーブルの作成
実際に構文を理解するために、サンプルテーブルを作成してみましょう。以下のクエリでusersテーブルを作成します。
mysql> create table users
-> (
-> Id int NOT NULL AUTO_INCREMENT,
-> UserName varchar(20),
-> UserLastseen datetime,
-> PRIMARY KEY(Id)
-> );
Query OK, 0 rows affected (0.91 sec)
このテーブルには、ユーザーID(Id)、ユーザー名(UserName)、最終アクセス日時(UserLastseen)の3つのカラムが定義されています。
サンプルデータの挿入
次に、INSERT文を使っていくつかのレコードを挿入します。
mysql> insert into users(UserName,UserLastseen) values('Larry','2019-01-15 02:45:00');
Query OK, 1 row affected (0.15 sec)
mysql> insert into users(UserName,UserLastseen) values('Sam',now());
Query OK, 1 row affected (0.25 sec)
mysql> insert into users(UserName,UserLastseen) values('Mike','2019-01-15 02:30:00');
Query OK, 1 row affected (0.15 sec)
mysql> insert into users(UserName,UserLastseen) values('Bob','2019-01-15 15:02:00');
Query OK, 1 row affected (0.23 sec)
mysql> insert into users(UserName,UserLastseen) values('David','2019-01-15 14:55:00');
Query OK, 1 row affected (0.15 sec)
なお、「Sam」のレコードにはnow()を使って挿入時点の現在日時を登録しています。これは後ほどの検索結果の確認に役立ちます。
テーブル内の全レコードを確認
SELECT文ですべてのレコードを表示してみましょう。
mysql> select *from users;
実行結果は以下の通りです。
+----+----------+---------------------+ | Id | UserName | UserLastseen | +----+----------+---------------------+ | 1 | Larry | 2019-01-15 02:45:00 | | 2 | Sam | 2019-01-15 15:01:52 | | 3 | Mike | 2019-01-15 02:30:00 | | 4 | Bob | 2019-01-15 15:02:00 | | 5 | David | 2019-01-15 14:55:00 | +----+----------+---------------------+ 5 rows in set (0.00 sec)
10分以内のレコードを抽出するクエリ
それでは、現在のタイムスタンプから10分以内のレコードだけを抽出してみます。実行するクエリは以下の通りです。
mysql> select *from users
-> where UserLastseen >= date_sub(now(),interval 10 minute);
実行結果:
+----+----------+---------------------+ | Id | UserName | UserLastseen | +----+----------+---------------------+ | 2 | Sam | 2019-01-15 15:01:52 | | 4 | Bob | 2019-01-15 15:02:00 | | 5 | David | 2019-01-15 14:55:00 | +----+----------+---------------------+ 3 rows in set (0.00 sec)
ご覧のとおり、現在時刻から10分以内にアクセスした「Sam」「Bob」「David」の3件のみが取得されました。「Larry」と「Mike」は最終アクセスが古いため、結果から除外されています。
応用ポイント
- 時間間隔の変更:
INTERVAL 10 MINUTEの部分を変更することで、30分前ならINTERVAL 30 MINUTE、1時間前ならINTERVAL 1 HOURのように柔軟に調整できます。 - インデックスの活用:対象カラム(例:
UserLastseen)にインデックスを作成しておくと、大量データでも高速に検索できます。 - 活用シーン:オンラインユーザーの判定や、直近のログ監視など、「直近N分以内のアクティビティ」を扱う場面で非常に役立ちます。
DATE_SUB(NOW(), INTERVAL 10 MINUTE)はMySQLの日時操作における基本的ながら強力なテクニックです。ぜひ実際の開発でも活用してみてください。
-
MySQLでカンマ区切りの値から特定の数値を含むレコードをすべて選択する方法
MySQLで特定の数値を含むレコードを抽出するには?カンマ区切りで保存された値の中に、特定の数値が含まれているレコードをすべて取得したい場合は、concat() 関数と LIKE 演算子を組み合わせて使用します。基本の構文は以下のとおりです。select *from yourTableName where concat(,, yourColumnName, ,) like %,yourValue,%;この方法のポイント単純に LIKE %4% とすると、「14」や「40」など意図しない数値までマッチしてしまう可能性があります。そこで、列の値の前後を concat() でカンマで囲むことで、「4
-
MySQLで特定の番号を含むレコードをすべて選択する方法|FIND_IN_SET()関数の使い方
MySQLで、カンマ区切りの値の中に特定の番号が含まれているレコードをすべて抽出したい場合は、FIND_IN_SET() 関数を使用します。この関数は、文字列リストの中から指定した値が何番目に存在するかを返し、見つからない場合は 0 を返します。そのため、結果が 0 より大きいかどうかを条件にすることで、目的の番号を含むレコードだけを取得できます。ここでは、実際にテーブルを作成して動作を確認してみましょう。1. テーブルの作成まず、サンプル用のテーブルを作成します。mysql> create table demo73 -> ( -> interest_id v