MySQLでDATETIME型とNULLのレコードが混在するテーブルから日付をフィルタリングする方法
この記事では、MySQLにおいて日付(DATETIME)レコードとNULLレコードが混在するテーブルから、特定の条件で日付をフィルタリングする方法を解説します。NULL値の扱いは初心者がつまずきやすいポイントなので、実際のコード例とともにわかりやすく説明していきます。
サンプルテーブルの作成
まず、2つのdatetime型カラムを持つテーブルを作成します。
mysql> create table DemoTable
(
FirstDate datetime,
SecondDate datetime
);
Query OK, 0 rows affected (0.57 sec)
レコードの挿入
INSERTコマンドを使って、いくつかのレコードを挿入します。ここでは検証用に、NULL値を含むレコードも意図的に追加しています。
mysql> insert into DemoTable values('2019-01-21','2018-01-21');
Query OK, 1 row affected (0.13 sec)
mysql> insert into DemoTable values('2019-10-04','2019-08-14');
Query OK, 1 row affected (0.16 sec)
mysql> insert into DemoTable values('2019-05-01','2019-09-11');
Query OK, 1 row affected (0.65 sec)
mysql> insert into DemoTable values(NULL,NULL);
Query OK, 1 row affected (0.18 sec)
mysql> insert into DemoTable values('2019-03-01',NULL);
Query OK, 1 row affected (0.13 sec)
テーブルの全レコードを表示する
SELECT文を実行して、登録されたすべてのレコードを確認してみましょう。
mysql> select *from DemoTable;
実行すると、次のような出力が得られます。
+---------------------+---------------------+ | FirstDate | SecondDate | +---------------------+---------------------+ | 2019-01-21 00:00:00 | 2018-01-21 00:00:00 | | 2019-10-04 00:00:00 | 2019-08-14 00:00:00 | | 2019-05-01 00:00:00 | 2019-09-11 00:00:00 | | NULL | NULL | | 2019-03-01 00:00:00 | NULL | +---------------------+---------------------+ 5 rows in set (0.00 sec)
日付をフィルタリングするクエリ
DATETIMEレコードとNULLレコードが混在するテーブルから日付を絞り込むには、以下のようにIS NULL句を条件に組み込んだクエリを使用します。
mysql> select *from DemoTable where FirstDate <= curdate() and (SecondDate >= curdate() or SecondDate IS NULL);
クエリのポイント
- FirstDate <= curdate():FirstDateが本日(現在の日付)以前であることを判定します。
- SecondDate >= curdate() or SecondDate IS NULL:SecondDateが本日以降であるか、あるいはNULLであることを判定します。
- NULLは通常の比較演算子(= や >= など)では正しく評価されないため、IS NULLによる明示的なチェックが必要になります。これが最大のポイントです。
実行結果
上記のクエリを実行すると、次の出力が得られます。
+---------------------+---------------------+ | FirstDate | SecondDate | +---------------------+---------------------+ | 2019-05-01 00:00:00 | 2019-09-11 00:00:00 | | 2019-03-01 00:00:00 | NULL | +---------------------+---------------------+ 2 rows in set (0.00 sec)
結果を見ると、「FirstDateが本日以前」かつ「SecondDateが本日以降またはNULL」という条件を満たす2件のレコードだけが抽出されています。このように、NULLが含まれる可能性のあるカラムを比較する際は、OR カラム名 IS NULL を組み合わせることで、意図した通りのフィルタリングが可能になります。実務でも有効期限や終了日が未定(NULL)のデータを扱うケースは多いため、覚えておくと便利なテクニックです。
-
MySQLのDELETE文とIN句を組み合わせて1つのクエリで複数レコードを削除する方法
MySQLでは、IN()句を活用することで、複数の条件値に一致するレコードを1つのDELETEクエリでまとめて削除できます。個別に削除クエリを実行する必要がなく、効率的なデータ操作が可能になります。ここでは、サンプルテーブルを作成し、実際にIN()句を使ったレコード削除の手順を解説します。1. サンプルテーブルの作成まず、テーブルを作成しましょう。mysql> create table DemoTable1922 ( StudentId int NOT NULL AUTO_INCREMENT PRIMARY KEY, StudentName varchar(20)
-
MySQLでテーブルの日付レコードを変更する方法|UPDATEとDATE_ADD()の使い方
MySQLで保存済みの日付データに年数を加算して変更したい場合、UPDATEコマンドとDATE_ADD()関数を組み合わせることで簡単に実現できます。ここでは、実際のSQLクエリ例を使いながら、日付レコードを変更する手順を順番に解説します。1. テーブルを作成するまず、日付型(date)のカラムを持つテーブルを作成します。mysql> create table DemoTable1984 ( ShippingDate date ); Query OK, 0 rows affected (0.00 sec)2. レコードを挿入する次に、INSERTコマンドを使ってテ