【保存版】MySQLで今日の日付を扱う!CURDATE関数、BETWEEN句、サブクエリを使いこなそう
MySQLで今日の日付を持つレコードを取得する方法
MySQLで、特定の列の日付が今日の日付と一致するレコードを抽出する方法はいくつかあります。ここでは、最も一般的な2つの方法を紹介します。
方法1:CURDATE()関数を使用する
構文
SELECT *
FROM your_table
WHERE DATE(your_date_column) = CURDATE();
説明
CURDATE()
関数は、現在のシステム日付をYYYY-MM-DD形式で返します。DATE()
関数は、指定された列の日付部分のみを抽出します。WHERE
句は、抽出するレコードを条件に絞り込みます。
例
SELECT *
FROM users
WHERE DATE(created_at) = CURDATE();
方法2:BETWEEN句を使用する
SELECT *
FROM your_table
WHERE your_date_column BETWEEN CONCAT(CURDATE(), ' 00:00:00') AND CONCAT(CURDATE(), ' 23:59:59');
CONCAT()
関数は、複数の文字列を結合します。BETWEEN
句は、指定された値の範囲内に収まるレコードを抽出します。
SELECT *
FROM orders
WHERE order_date BETWEEN CONCAT(CURDATE(), ' 00:00:00') AND CONCAT(CURDATE(), ' 23:59:59');
補足
- 上記の例では、
*
を使用してすべての列を取得していますが、必要な列のみを取得することもできます。 WHERE
句に複数の条件を指定することもできます。- 複数の抽出方法を組み合わせることもできます。
- 上記のコードは、MySQL 8.0以降で使用できます。
- 他のバージョンのMySQLを使用している場合は、構文が異なる場合があります。
ご参考になりましたでしょうか?
-- ユーザーテーブル(users)から、今日登録されたユーザーを取得する
SELECT *
FROM users
WHERE DATE(created_at) = CURDATE();
-- 注文テーブル(orders)から、今日発注された注文を取得する
SELECT *
FROM orders
WHERE order_date BETWEEN CONCAT(CURDATE(), ' 00:00:00') AND CONCAT(CURDATE(), ' 23:59:59');
- 上記のサンプルコードは、それぞれ異なるテーブル(users, orders)に対して今日の日付に関連するレコードを取得しています。
- 実際のコードでは、テーブル名や列名を置き換えてください。
- 必要に応じて、取得する列や条件を変更してください。
MySQLで今日の日付を持つレコードを取得するその他の方法
方法3:サブクエリを使用する
SELECT *
FROM your_table
WHERE your_date_column IN (
SELECT your_date_column
FROM your_table
WHERE DATE(your_date_column) = CURDATE()
);
- この方法は、サブクエリを使用して、今日の日付を持つレコードのリストを取得します。
- メインクエリは、サブクエリで返されたレコードと一致するレコードのみを抽出します。
SELECT *
FROM orders
WHERE order_date IN (
SELECT order_date
FROM orders
WHERE DATE(order_date) = CURDATE()
);
方法4:EXISTS句を使用する
SELECT *
FROM your_table
WHERE EXISTS (
SELECT 1
FROM your_table AS sub
WHERE sub.your_date_column = your_table.your_date_column
AND DATE(sub.your_date_column) = CURDATE()
);
- メインクエリは、EXISTS句がTRUEを返すレコードのみを抽出します。
SELECT *
FROM users
WHERE EXISTS (
SELECT 1
FROM users AS sub
WHERE sub.created_at = users.created_at
AND DATE(sub.created_at) = CURDATE()
);
方法5:パフォーマンスに優れた方法
SELECT *
FROM your_table
WHERE your_date_column >= CURDATE()
AND your_date_column < CURDATE() + INTERVAL 1 DAY;
- この方法は、
>=
と<
演算子を使用して、今日の日付を含む範囲のレコードを抽出します。 - この方法は、サブクエリを使用する他の方法よりもパフォーマンスが優れている可能性があります。
SELECT *
FROM orders
WHERE order_date >= CURDATE()
AND order_date < CURDATE() + INTERVAL 1 DAY;
どの方法を選択するかは、状況によって異なります。一般的には、以下の点を考慮する必要があります。
- シンプルさ: CURDATE() 関数を使用する方法は最もシンプルです。
- パフォーマンス: サブクエリを使用する方法は、パフォーマンスが劣化する可能性があります。
- 可読性: EXISTS 句を使用する方法は、可読性が低いかもしれません。
- 互換性: INTERVAL 演算子は、すべてのバージョンの MySQL で使用できるわけではありません。
mysql