MySQL
 Computer >> コンピューター >  >> プログラミング >> MySQL

MySQLでDATE文字列とDATETIME型カラムを比較する方法

MySQLでは、DATE()関数を使うことで、DATETIME型カラムから取り出した日付文字列と、任意の日付文字列(DATE形式)を比較できます。DATETIME型は「日付+時刻」の情報を持つため、そのまま文字列と比較すると時刻部分が一致せずヒットしません。そこでDATE()関数で日付部分だけを抽出して比較するのがポイントです。

基本構文

SELECT * FROM テーブル名 WHERE DATE(カラム名) = '任意の日付文字列';

検証用テーブルの作成

それでは、実際にテーブルを作成して動作を確認してみましょう。まずはDATETIME型のカラムを持つテーブルを作成します。

mysql> CREATE TABLE DateTimeDemo
    -> (
    -> ArrivalTime datetime
    -> );
Query OK, 0 rows affected (0.61 sec)

テストデータの挿入

次に、INSERTコマンドを使ってレコードを挿入します。NOW()関数やDATE_ADD()関数を組み合わせることで、現在日時を基準としたさまざまな日時データを簡単に登録できます。

mysql> INSERT INTO DateTimeDemo VALUES(NOW());
Query OK, 1 row affected (0.11 sec)

mysql> INSERT INTO DateTimeDemo VALUES(DATE_ADD(NOW(), INTERVAL 2 YEAR));
Query OK, 1 row affected (0.47 sec)

mysql> INSERT INTO DateTimeDemo VALUES(DATE_ADD(NOW(), INTERVAL 1 YEAR));
Query OK, 1 row affected (0.19 sec)

mysql> INSERT INTO DateTimeDemo VALUES(DATE_ADD(NOW(), INTERVAL 4 YEAR));
Query OK, 1 row affected (0.13 sec)

mysql> INSERT INTO DateTimeDemo VALUES(DATE_ADD(NOW(), INTERVAL -2 YEAR));
Query OK, 1 row affected (0.17 sec)

mysql> INSERT INTO DateTimeDemo VALUES(DATE_ADD(NOW(), INTERVAL -1 YEAR));
Query OK, 1 row affected (0.17 sec)

登録データの確認

SELECT文ですべてのレコードを表示してみます。

mysql> SELECT * FROM DateTimeDemo;

実行結果は以下の通りです。

+---------------------+
| ArrivalTime         |
+---------------------+
| 2018-12-06 10:12:45 |
| 2020-12-06 10:13:10 |
| 2019-12-06 10:13:21 |
| 2022-12-06 10:13:27 |
| 2016-12-06 10:13:42 |
| 2017-12-06 10:13:50 |
+---------------------+
6 rows in set (0.00 sec)

DATETIMEカラムと日付文字列の比較

それでは、冒頭で紹介した構文を実装して、DATETIME型カラムと日付文字列を比較してみましょう。「2022年12月6日のレコード」を抽出するクエリは次のようになります。

mysql> SELECT * FROM DateTimeDemo WHERE DATE(ArrivalTime) = '2022-12-06';

実行結果:

+---------------------+
| ArrivalTime         |
+---------------------+
| 2022-12-06 10:13:27 |
+---------------------+
1 row in set (0.14 sec)

このように、時刻が異なるレコードでもDATE()関数で日付部分だけを取り出して比較すれば、目的の日付に該当するレコードを正しく取得できます。

補足:パフォーマンスに関する注意点

WHERE DATE(カラム名) = '...'のようにカラムに関数を適用すると、インデックスが利用されず全件スキャンになる場合があります。大量データを扱う場合は、範囲指定による比較(例:WHERE ArrivalTime >= '2022-12-06 00:00:00' AND ArrivalTime < '2022-12-07 00:00:00')の方が高速に動作するので、用途に応じて使い分けるとよいでしょう。

  1. MySQLで当日の00:00から現在時刻までのレコードを抽出するクエリの書き方

    はじめにMySQLで「今日の日付の午前0時(00:00)から現在時刻まで」のレコードを取得したいケースはよくあります。例えば、現在の日時が 2019-09-14 08:50:10 である場合、2019-09-14 00:00:00 から 2019-09-14 08:50:10 までの範囲にあるレコードを抽出することになります。本記事では、実際にテーブルを作成し、データを挿入しながら、この条件を実現するクエリを具体的に解説します。サンプルテーブルの作成まず、DATETIME型のカラムを持つテーブルを作成します。mysql> create table DemoTable( &nbs

  2. MySQLで文字列から日付を抽出する方法|SUBSTRING_INDEX関数の実践的な使い方

    MySQLで文字列から日付を抽出するには?MySQLで文字列の中から日付部分だけを取り出したい場合、SUBSTRING_INDEX() 関数を使うのが便利です。この関数は、指定した区切り文字を基準に文字列を分割し、必要な部分を取得できます。ここでは、実際にテーブルを作成し、文章の中に含まれる日付(例:12/31/2018)を抽出する手順を解説します。1. サンプルテーブルを作成するまず、文字列を格納するためのテーブルを作成します。mysql> create table DemoTable -> ( -> Title text -> );Query OK