MySQLで本日日付より大きいまたは同等のDATETIMEを簡単に見つける
MySQLで本日日付より大きいまたは同等の DATETIME を取得する方法
CURDATE() 関数と比較演算子を用いる
最もシンプルな方法は、CURDATE()
関数で本日日付を取得し、比較演算子を用いて DATETIME 列と比較する方法です。
SELECT *
FROM your_table
WHERE your_datetime_column >= CURDATE();
このクエリは、your_table
テーブルのすべてのレコードのうち、your_datetime_column
の値が本日日付(CURDATE()
) より大きいまたは同等なものをすべて選択します。
STRICT モードを無効にして CAST() 関数と比較演算子を用いる
MySQLの STRICT モードが有効な場合、CURDATE()
関数は文字列として扱われます。そのため、比較演算子を用いて DATETIME 列と直接比較することはできません。
この場合は、STRICT モードを無効化するか、CAST() 関数を使用して CURDATE()
の値を DATETIME 型に変換する必要があります。
SET @@sql_mode = ''; -- STRICT モードを無効化
SELECT *
FROM your_table
WHERE your_datetime_column >= CAST(CURDATE() AS DATETIME);
MySQL 5.7以降では、CURRENT_DATE()
関数を使用することができます。この関数は CURDATE()
関数と同様に本日日付を取得しますが、STRICT モードの影響を受けません。
SELECT *
FROM your_table
WHERE your_datetime_column >= CURRENT_DATE();
補足
- 上記のクエリは、本日日付の00:00:00以降の DATETIME を取得します。
- 特定の時間以降の DATETIME を取得したい場合は、
>=
を>
に置き換えてください。 - 複数の条件を組み合わせる場合は、
AND
句を使用してください。
CREATE TABLE IF NOT EXISTS your_table (
id INT PRIMARY KEY AUTO_INCREMENT,
your_datetime_column DATETIME NOT NULL
);
INSERT INTO your_table (your_datetime_column) VALUES
('2024-04-20 10:20:30'),
('2024-04-25 12:34:56'),
('2024-04-26 15:00:00');
SELECT *
FROM your_table
WHERE your_datetime_column >= CURDATE();
出力結果
id | your_datetime_column
---+----------------------
2 | 2024-04-25 12:34:56
3 | 2024-04-26 15:00:00
SET @@sql_mode = '';
CREATE TABLE IF NOT EXISTS your_table (
id INT PRIMARY KEY AUTO_INCREMENT,
your_datetime_column DATETIME NOT NULL
);
INSERT INTO your_table (your_datetime_column) VALUES
('2024-04-20 10:20:30'),
('2024-04-25 12:34:56'),
('2024-04-26 15:00:00');
SELECT *
FROM your_table
WHERE your_datetime_column >= CAST(CURDATE() AS DATETIME);
(1. と同じ)
CREATE TABLE IF NOT EXISTS your_table (
id INT PRIMARY KEY AUTO_INCREMENT,
your_datetime_column DATETIME NOT NULL
);
INSERT INTO your_table (your_datetime_column) VALUES
('2024-04-20 10:20:30'),
('2024-04-25 12:34:56'),
('2024-04-26 15:00:00');
SELECT *
FROM your_table
WHERE your_datetime_column >= CURRENT_DATE();
説明
上記のサンプルコードでは、以下の3つの方法で本日日付より大きいまたは同等の DATETIME を取得しています。
- CURDATE() 関数と比較演算子を用いる
- STRICT モードを無効にして CAST() 関数と比較演算子を用いる
- STRICT モードが有効な場合は、
SET @@sql_mode = '';
で無効化します。
- STRICT モードが有効な場合は、
これらの方法はそれぞれ異なる方法で本日日付を取得していますが、いずれの方法も本日日付より大きいまたは同等の DATETIME を取得することができます。
- 上記のサンプルコードは、あくまでも一例です。必要に応じて、テーブル名、カラム名、条件などを変更してください。
MySQLで本日日付より大きいまたは同等の DATETIME を取得する方法:その他の方法
BETWEEN 句を使用する
SELECT *
FROM your_table
WHERE your_datetime_column BETWEEN CURDATE() AND ADDDATE(CURDATE(), INTERVAL 1 DAY);
このクエリは、your_datetime_column
の値が本日日付(CURDATE()
) と明日日付(ADDDATE(CURDATE(), INTERVAL 1 DAY)
) の間に存在するレコードをすべて選択します。
SELECT *
FROM your_table
WHERE your_datetime_column >= SUBSTRING_INDEX(your_datetime_column, '-', 1);
このクエリは、your_datetime_column
の値から最後のハイフン('-')以降の部分を SUBSTRING_INDEX()
関数で抽出し、比較演算子 >=
を用いて本日日付と比較します。
CASE 式を使用する
SELECT *
FROM your_table
WHERE CASE
WHEN your_datetime_column >= CURDATE() THEN 1
ELSE 0
END = 1;
このクエリは、your_datetime_column
の値が本日日付(CURDATE()
) より大きい場合は 1、そうでない場合は 0 を CASE
式で判定し、その結果が 1 であるレコードをすべて選択します。
GROUP BY 句と HAVING 句を使用する
SELECT *
FROM your_table
GROUP BY DATE(your_datetime_column)
HAVING DATE(your_datetime_column) >= CURDATE();
このクエリは、your_datetime_column
の値を日付でグループ化し、グループの日付が本日日付(CURDATE()
) より大きいグループのみを HAVING
句で抽出します。
ウィンドウ関数を使用する
SELECT *
FROM your_table
ORDER BY your_datetime_column
ROWS BETWEEN CURRENT_ROW() AND LAST_ROW() OVER (ORDER BY your_datetime_column);
このクエリは、your_datetime_column
の値で昇順に並べ替え、現在行と最後の行の間にある行のみをウィンドウ関数 LAST_ROW()
を用いて抽出します。
- それぞれの方法には利点と欠点がありますので、状況に合わせて最適な方法を選択してください。
- 特定の時間以降の DATETIME を取得したい場合は、上記の方法を組み合わせることで実現できます。
mysql sql datetime