MySQLで2つの日付の範囲内にあるデータをすべて取得する方法(BETWEEN句の使い方)
はじめに
MySQLである2つの日付の間に存在するデータをすべて取得したい場合は、BETWEEN演算子を使用します。BETWEENは指定した開始日と終了日の両方を含む範囲で条件を絞り込めるため、期間検索に非常に便利です。
BETWEENを使った基本構文
SELECT * FROM テーブル名 WHERE カラム名 BETWEEN '日付1' AND '日付2';
それでは、実際にテーブルを作成しながら具体的な使用例を見ていきましょう。
サンプルテーブルの作成
まず、従業員情報を格納するテーブルを作成します。
mysql> CREATE TABLE DemoTable1422
-> (
-> EmployeeId int NOT NULL AUTO_INCREMENT PRIMARY KEY,
-> EmployeeName varchar(20),
-> EmployeeJoiningDate date
-> );
Query OK, 0 rows affected (0.69 sec)次に、INSERT文で複数のレコードを挿入します。
mysql> INSERT INTO DemoTable1422(EmployeeName,EmployeeJoiningDate) VALUES('John','2017-09-28');
Query OK, 1 row affected (0.39 sec)
mysql> INSERT INTO DemoTable1422(EmployeeName,EmployeeJoiningDate) VALUES('Chris','2019-09-29');
Query OK, 1 row affected (0.11 sec)
mysql> INSERT INTO DemoTable1422(EmployeeName,EmployeeJoiningDate) VALUES('Bob','2018-01-31');
Query OK, 1 row affected (0.55 sec)
mysql> INSERT INTO DemoTable1422(EmployeeName,EmployeeJoiningDate) VALUES('Sam','2018-12-21');
Query OK, 1 row affected (0.17 sec)
mysql> INSERT INTO DemoTable1422(EmployeeName,EmployeeJoiningDate) VALUES('Mike','2019-11-10');
Query OK, 1 row affected (0.11 sec)テーブルの中身を確認する
SELECT文ですべてのレコードを表示してみましょう。
mysql> SELECT * FROM DemoTable1422;
実行結果は以下の通りです。
+------------+--------------+---------------------+ | EmployeeId | EmployeeName | EmployeeJoiningDate | +------------+--------------+---------------------+ | 1 | John | 2017-09-28| | 2 | Chris | 2019-09-29| | 3 | Bob | 2018-01-31| | 4 | Sam | 2018-12-21| | 5 | Mike | 2019-11-10| +------------+--------------+---------------------+ 5 rows in set (0.00 sec)
日付の範囲でデータを抽出するクエリ
ここで本題です。「2018-09-29」から「2019-09-29」までの期間に入社した従業員を取得するには、次のようにBETWEENを使用します。
mysql> SELECT * FROM DemoTable1422 WHERE EmployeeJoiningDate BETWEEN '2018-09-29' AND '2019-09-29';
実行結果:
+------------+--------------+---------------------+ | EmployeeId | EmployeeName | EmployeeJoiningDate | +------------+--------------+---------------------+ | 2 | Chris | 2019-09-29| | 4 | Sam | 2018-12-21| +------------+--------------+---------------------+ 2 rows in set (0.00 sec)
このように、指定した期間内(境界値を含む)のレコードだけが抽出されました。
注意点
- BETWEENは両端を含む:開始日と終了日の両方が一致するデータも結果に含まれます。
- DATETIME型の場合の注意:カラムがDATETIME型の場合、「2019-09-29」は「2019-09-29 00:00:00」と解釈されるため、時刻を持つデータを含めたい場合は「AND '2019-09-29 23:59:59'」と指定するか、「< 翌日の日付」とする方法が推奨されます。
- インデックスの活用:日付カラムにインデックスを作成しておくと、大量データでも範囲検索が高速に行えます。
まとめ
MySQLで特定の期間のデータを取得するには、WHERE句とBETWEEN演算子を組み合わせるのが最もシンプルで分かりやすい方法です。境界値の扱いやDATETIME型の時刻部分に注意すれば、業務システムでの集計やレポート作成など、さまざまな場面で活用できます。
-
MySQLで現在日時に最も近い次の日付を取得するクエリの書き方
MySQLでは、ORDER BY句とCASE式を組み合わせることで、「現在日時以降の日付の中で最も近い日」を1件だけ取得できます。この記事では、出荷日(ShippingDate)カラムを持つテーブルを例に、具体的な手順をわかりやすく解説します。 基本の構文 select * from yourTableName order by ( yourColumnName > now()) desc, (case when yourColumnName > now() then yourColumnName end) , yourColumnName desc limit 1;
-
2つのテーブルに対する単一のMySQL SELECTクエリは可能ですか?
はい、可能です。FROM句にカンマ区切りで複数のテーブル名を指定することで、単一のSELECTクエリで2つのテーブルからデータを取得できます。基本的な構文は以下の通りです。select * from yourTableName1,yourTableName2;なお、この書き方では両テーブルの全行が組み合わされた「クロス結合(直積)」の結果が返される点に注意してください。サンプルテーブルの作成まず、1つ目のテーブルを作成します。mysql> create table DemoTable1 -> ( &nb