MySQLで今日の日付が2つのDATE型カラムの間にある行を抽出する方法
MySQLで「今日の日付が2つの日付カラム(開始日と終了日)の間に含まれる」レコードを抽出したい場合は、AND演算子を使って2つの条件を組み合わせます。キャンペーン期間や予約期間など、日付の範囲でデータを管理しているテーブルでよく使われるテクニックです。
基本構文
SELECT * FROM テーブル名 WHERE 開始日カラム名 <= '日付値' AND 終了日カラム名 >= '日付値';
この条件では、指定した日付が「開始日以降」かつ「終了日以前」である場合に、その行が結果として返されます。
サンプルテーブルの作成
それでは、実際に動作を確認するためのテーブルを作成しましょう。開始日(StartingDate)と終了日(EndingDate)を持つシンプルな構造です。
mysql> create table selectDates -> ( -> Id int NOT NULL AUTO_INCREMENT, -> StartingDate date, -> EndingDate date, -> PRIMARY KEY(Id) -> ); Query OK, 0 rows affected (0.80 sec)
テストデータの挿入
次に、INSERT文を使って複数の期間データを登録します。
mysql> insert into selectDates(StartingDate,EndingDate) values('2019-01-11','2019-01-23');
Query OK, 1 row affected (0.17 sec)
mysql> insert into selectDates(StartingDate,EndingDate) values('2019-01-10','2019-01-23');
Query OK, 1 row affected (0.17 sec)
mysql> insert into selectDates(StartingDate,EndingDate) values('2019-01-30','2019-01-30');
Query OK, 1 row affected (0.12 sec)
mysql> insert into selectDates(StartingDate,EndingDate) values('2019-10-14','2019-10-28');
Query OK, 1 row affected (0.17 sec)
mysql> insert into selectDates(StartingDate,EndingDate) values('2019-10-14','2019-10-20');
Query OK, 1 row affected (0.19 sec)
mysql> insert into selectDates(StartingDate,EndingDate) values('2019-11-17','2019-11-19');
Query OK, 1 row affected (0.52 sec)
mysql> insert into selectDates(StartingDate,EndingDate) values('2019-12-21','2019-12-31');
Query OK, 1 row affected (0.19 sec)
mysql> insert into selectDates(StartingDate,EndingDate) values('2019-01-06','2019-01-21');
Query OK, 1 row affected (0.16 sec)
mysql> insert into selectDates(StartingDate,EndingDate) values('2019-01-07','2019-01-17');
Query OK, 1 row affected (0.18 sec)
登録データの確認
SELECT文ですべてのレコードを表示してみましょう。
mysql> select *from selectDates;
実行結果は以下の通りです。
+----+--------------+------------+ | Id | StartingDate | EndingDate | +----+--------------+------------+ | 1 | 2019-01-11 | 2019-01-23 | | 2 | 2019-01-10 | 2019-01-23 | | 3 | 2019-01-30 | 2019-01-30 | | 4 | 2019-10-14 | 2019-10-28 | | 5 | 2019-10-14 | 2019-10-20 | | 6 | 2019-11-17 | 2019-11-19 | | 7 | 2019-12-21 | 2019-12-31 | | 8 | 2019-01-06 | 2019-01-21 | | 9 | 2019-01-07 | 2019-01-17 | +----+--------------+------------+ 9 rows in set (0.00 sec)
指定日が期間内にある行を抽出するクエリ
ここでは例として、「2019-01-10」という日付が開始日と終了日の間にあるレコードを抽出します。
select *from selectDates where StartingDate <='2019-01-10' AND EndingDate >='2019-01-10';
実行結果は以下の通りです。
+----+--------------+------------+ | Id | StartingDate | EndingDate | +----+--------------+------------+ | 2 | 2019-01-10 | 2019-01-23 | | 8 | 2019-01-06 | 2019-01-21 | | 9 | 2019-01-07 | 2019-01-17 | +----+--------------+------------+ 3 rows in set (0.00 sec)
Id 2、8、9のレコードはいずれも「2019-01-10」が期間内に含まれているため正しく抽出されています。一方、Id 1(開始日が2019-01-11)は指定日より後に始まるため、結果には含まれません。
補足:CURDATE()で現在日付を動的に指定する
実際のアプリケーションでは、日付値を固定ではなくCURDATE()関数で動的に取得すると便利です。「今日が有効期間内かどうか」を判定するには、次のように記述します。
SELECT * FROM selectDates WHERE StartingDate <= CURDATE() AND EndingDate >= CURDATE();
このようにAND演算子と比較演算子(<=、>=)を組み合わせることで、任意の日付が2つのDATE型カラムの間にあるレコードを簡単に絞り込むことができます。
-
MySQLで2つの日付の範囲内にあるデータをすべて取得する方法(BETWEEN句の使い方)
はじめにMySQLである2つの日付の間に存在するデータをすべて取得したい場合は、BETWEEN演算子を使用します。BETWEENは指定した開始日と終了日の両方を含む範囲で条件を絞り込めるため、期間検索に非常に便利です。BETWEENを使った基本構文SELECT * FROM テーブル名 WHERE カラム名 BETWEEN 日付1 AND 日付2;それでは、実際にテーブルを作成しながら具体的な使用例を見ていきましょう。サンプルテーブルの作成まず、従業員情報を格納するテーブルを作成します。mysql> CREATE TABLE DemoTable1422 -> ( -
-
異なる列にある2つの日付間の日数を計算するMySQLクエリ
MySQLでは、DATEDIFF()関数を使うことで、同じテーブル内の異なる列に格納された2つの日付の差(日数)を簡単に計算できます。ここでは、社員の入社日と退職日から勤務日数を求める例を紹介します。1. テーブルを作成するまず、2つの日付型の列を持つテーブルを作成します。mysql> create table DemoTable1471-> (-> EmployeeJoiningDate date,-> EmployeeRelievingDate date-> );Query OK, 0 rows affected (0.57 sec)2. レコードを挿入するI