【MySQL】2日以内に有効期限が切れるレコードを検索するクエリの書き方
MySQLで2日以内に有効期限が到来するレコードを検索したい場合は、BETWEENキーワードを使用すると簡単に実現できます。この記事では、テーブル作成から実際の検索クエリまで、手順を追って解説します。
1. サンプルテーブルの作成
まず、有効期限日を格納するテーブルを作成しましょう。
mysql> create table DemoTable
(
ExpiryDate date
);
Query OK, 0 rows affected (0.55 sec)注意: この記事では、現在の日付が「2019-08-18」であることを前提に説明を進めます。
2. テストデータの挿入
INSERT文を使って、いくつかのレコードをテーブルに登録します。
mysql> insert into DemoTable values('2018-01-21');
Query OK, 1 row affected (0.11 sec)
mysql> insert into DemoTable values('2019-08-20');
Query OK, 1 row affected (0.39 sec)
mysql> insert into DemoTable values('2018-08-20');
Query OK, 1 row affected (0.08 sec)
mysql> insert into DemoTable values('2019-08-21');
Query OK, 1 row affected (0.14 sec)3. 登録されたレコードの確認
SELECT文ですべてのレコードを表示してみましょう。
mysql> select *from DemoTable;
実行すると、以下のような結果が得られます。
+------------+ | ExpiryDate | +------------+ | 2018-01-21 | | 2019-08-20 | | 2018-08-20 | | 2019-08-21 | +------------+ 4 rows in set (0.00 sec)
4. 2日以内に期限が切れるレコードを検索するクエリ
CURDATE()関数とBETWEEN句を組み合わせることで、今日から2日後までの範囲に含まれる有効期限を持つレコードを抽出できます。
mysql> select *from DemoTable where ExpiryDate between curdate() AND curdate() + 2;
このクエリを実行すると、次の出力が得られます。
+------------+ | ExpiryDate | +------------+ | 2019-08-20 | +------------+ 1 row in set (0.00 sec)
結果の解説
現在の日付が「2019-08-18」の場合、「curdate() + 2」は「2019-08-20」に相当します。そのため、BETWEENによる検索範囲は「2019-08-18」から「2019-08-20」までとなり、条件に合致するのは「2019-08-20」の1件のみです。「2019-08-21」は範囲外のため除外されます。
なお、日付の加算はINTERVAL式を使った「curdate() + INTERVAL 2 DAY」や、ADDDATE()関数でも記述できます。これらの方法は意図がより明確に伝わるため、実務では推奨される書き方です。
-
MySQLで現在の日付とテーブル内の日付レコードの差を求める方法
現在の日付とテーブルに保存された日付レコードの差(日数)を求めるには、MySQLの DATEDIFF() 関数を使用します。この関数は、2つの日付の差を日数で返してくれる便利な関数です。ここでは、実際にテーブルを作成し、データを挿入して、現在の日付との差を計算する手順を順番に見ていきましょう。1. テーブルの作成まず、日付型のカラムを持つテーブルを作成します。mysql> create table DemoTable1446-> (-> DueDate date-> );Query OK, 0 rows affected (1.42 sec)2. レコードの挿入次に、I
-
MySQLで2つの列の組み合わせごとの出現回数を集計する方法
MySQLでは、GROUP BY句とGREATEST()・LEAST()関数を組み合わせることで、2つの列にまたがる値の組み合わせごとの出現回数を簡単に集計できます。この記事では、具体的なサンプルを使って手順を解説します。1. サンプルテーブルを作成するまず、2つの名前列を持つテーブルを作成します。mysql> create table DemoTable -> ( -> Name1 varchar(20), -> Name2 varchar(20) -> );Query OK, 0 rows affected (0.61 sec)2. テ