MySQLで条件を指定して日付の期間(間・前・後)を抽出する方法
MySQLでは、WHERE句にAND条件とOR条件を組み合わせることで、「ある日付より前」かつ「別のある日付より後、またはNULL」といった複雑な条件付きの日付抽出が可能になります。退職日(relieving_date)が未設定のレコードも含めて抽出したい場合などに特に便利です。
基本の構文
条件付きで日付を選択する場合の基本的な構文は以下の通りです。
SELECT * FROM テーブル名 WHERE カラム名1 < 値1 AND (カラム名2 > 値2 OR カラム名2 IS NULL);
この構文のポイントは、OR条件部分を括弧()で囲むことです。これにより、AND条件との優先順位が明確になり、意図した通りの結果が得られます。
サンプルテーブルの作成
まず、入社日(joining_date)と退職日(relieving_date)を持つテーブルを作成してみましょう。
mysql> create table demo35 -> ( -> id int NOT NULL AUTO_INCREMENT PRIMARY KEY, -> joining_date date, -> relieving_date date -> ); Query OK, 0 rows affected (3.88 sec)
レコードの挿入
次に、INSERT文を使ってサンプルデータを挿入します。
mysql> insert into demo35(joining_date, relieving_date) values('2020-01-10', '2020-07-11');
Query OK, 1 row affected (0.15 sec)
mysql> insert into demo35(joining_date, relieving_date) values('2020-05-07', '2020-12-08');
Query OK, 1 row affected (0.17 sec)
mysql> insert into demo35(joining_date, relieving_date) values('2020-04-11', '2020-09-18');
Query OK, 1 row affected (0.14 sec)
mysql> insert into demo35(joining_date, relieving_date) values('2020-03-12', '2020-10-01');
Query OK, 1 row affected (0.13 sec)
登録データの確認
SELECT文でテーブルの中身を表示して確認しましょう。
mysql> select *from demo35;
このクエリを実行すると、以下のような結果が出力されます。
+----+--------------+----------------+ | id | joining_date | relieving_date | +----+--------------+----------------+ | 1 | 2020-01-10 | 2020-07-11 | | 2 | 2020-05-07 | 2020-12-08 | | 3 | 2020-04-11 | 2020-09-18 | | 4 | 2020-03-12 | 2020-10-01 | +----+--------------+----------------+ 4 rows in set (0.00 sec)
条件付きで日付を抽出するクエリ
それでは実際に、「2020年5月11日より前に入社し、かつ2020年8月10日より後に退職している(または退職日がNULL)」という条件でレコードを抽出してみます。
mysql> select *from demo35 -> where -> joining_date < '2020-05-11' AND -> (relieving_date > '2020-08-10' OR relieving_date is null);
このクエリを実行すると、以下の出力が得られます。
+----+--------------+----------------+ | id | joining_date | relieving_date | +----+--------------+----------------+ | 2 | 2020-05-07 | 2020-12-08 | | 3 | 2020-04-11 | 2020-09-18 | | 4 | 2020-03-12 | 2020-10-01 | +----+--------------+----------------+ 3 rows in set (0.00 sec)
結果の解説
出力結果を見ると、id 2〜4の3件が該当しています。id 1のレコードは入社日は条件を満たしていますが、退職日が「2020-07-11」であり「2020-08-10」より後ではないため除外されました。
このように、AND演算子で複数の条件を連結し、OR演算子とIS NULLを括弧で組み合わせることで、柔軟な日付条件でのデータ抽出が実現できます。在籍期間による絞り込みや、退職日が未確度の現役社員を含めた検索など、実務でも幅広く活用できるテクニックなので、ぜひマスターしておきましょう。
-
MySQLで再帰的なSELECTクエリを実行する方法【初心者向けに具体例つきで解説】
MySQLでは、ユーザー定義変数(セッション変数)を活用することで、再帰的なSELECTクエリを実現できます。本記事では、実際にテーブルを作成し、データを挿入したうえで、再帰的なSELECTの具体的な書き方を順を追って解説します。 1. サンプルテーブルの作成 まず、再帰的なSELECTを試すためのサンプルテーブルを作成します。テーブルの作成にはCREATEコマンドを使用します。 mysql> CREATE table tblSelectDemo - > ( - > id int, - > name varchar(100) - > );
-
MySQLでテーブルの最後の10件のレコードを取得する方法
MySQLでテーブルの末尾にある10行(最新の10件)を取得したい場合は、SELECT文とLIMIT句を組み合わせたサブクエリを利用します。この記事では、実際にテーブルを作成し、データを挿入しながら、最後の10件を取得するクエリの手順を具体的に解説します。 1. サンプルテーブルの作成 まず、動作確認用のテーブルを作成します。 mysql> create table Last10RecordsDemo -> ( -> id int, -> name varchar(100) -> ); Query OK, 0 rows affected