勉強したことのメモ

Webエンジニア / プログラマが勉強したことのメモ

MySQLでdatetime型のカラムをdate型やtime型に変換して検索する方法

MySQLでdatetime型のカラムがあり、そちらをdate型やtime型に変換して検索したい。具体的には「開始日時」「終了日時」のdatetime型カラムがあり、開始日のみ(date型で)の検索と開始~終了時間(time型)の検索という2パターンを行いたい。以下に対応方法をメモ。

 

テーブル構造

mysql> SHOW COLUMNS FROM `test_table`;
+-------+----------+------+-----+---------+----------------+
| Field | Type     | Null | Key | Default | Extra          |
+-------+----------+------+-----+---------+----------------+
| id    | int      | NO   | PRI | NULL    | auto_increment |
| start | datetime | NO   |     | NULL    |                |
| end   | datetime | NO   |     | NULL    |                |
+-------+----------+------+-----+---------+----------------+

 

データ内容

mysql> TABLE `test_table`;
+----+---------------------+---------------------+
| id | start               | end                 |
+----+---------------------+---------------------+
|  1 | 2025-05-01 15:00:00 | 2025-05-01 18:00:00 |
|  2 | 2025-12-01 00:00:00 | 2025-12-01 05:00:00 |
|  3 | 2025-01-01 01:00:00 | 2025-01-01 02:30:00 |
+----+---------------------+---------------------+

 

対応方法

date型に変換して検索

SELECT * 
FROM `test_table` 
WHERE CAST( `start` AS DATE ) = '2025-05-01';

出力例

+----+---------------------+---------------------+
| id | start               | end                 |
+----+---------------------+---------------------+
|  1 | 2025-05-01 15:00:00 | 2025-05-01 18:00:00 |
+----+---------------------+---------------------+

time型に変換して検索

SELECT * 
FROM `test_table` 
WHERE CAST( `start` AS TIME ) >= '00:00:00'
AND CAST( `end` AS TIME ) <= '03:00:00';

出力例

+----+---------------------+---------------------+
| id | start               | end                 |
+----+---------------------+---------------------+
|  3 | 2025-01-01 01:00:00 | 2025-01-01 02:30:00 |
+----+---------------------+---------------------+

併用も可能

SELECT * 
FROM `test_table` 
WHERE CAST( `start` AS DATE ) = '2025-05-01'
AND CAST( `start` AS TIME ) >= '00:00:00';

出力例

+----+---------------------+---------------------+
| id | start               | end                 |
+----+---------------------+---------------------+
|  1 | 2025-05-01 15:00:00 | 2025-05-01 18:00:00 |
+----+---------------------+---------------------+

 

リファレンス

CAST

https://dev.mysql.com/doc/refman/8.0/ja/cast-functions.html#function_cast

 

所感

わざわざ変換して検索する形となっており、DB構造自体が良くないのかなぁとは思いつつも「開始年月日」「開始時分秒」「終了年月日」「終了時分秒」の4カラムに増やすのもそれはそれで違う気がして悩ましいところ。

 - MySQL / MariaDB データベース

  関連記事

MySQLで全角半角を区別せずに検索する方法(collate utf8_unicode_ci)
MySQLで全角半角を区別せずに検索する方法(collate utf8_unicode_ci)

あるシステムでMySQLの検索時に「WHERE test_column coll ...

MySQLで特定のテーブルにパーティショニング設定し高速化を図る方法
MySQLで特定のテーブルにパーティショニング設定し高速化を図る方法

以前に他社が設計されたログ系のテーブルを拝見した際にパーティショニング設定が行わ ...

MySQLでランダムにデータを取得しつつページング機能も実装する方法
MySQLでランダムにデータを取得しつつページング機能も実装する方法

MySQLからデータを持ってくる際にランダムな表示を行ってほしいと言われた。ただ ...

MySQLで同一サーバーの異なるDB内のテーブルをJOINする
MySQLで同一サーバーの異なるDB内のテーブルをJOINする

同一のMySQLサーバーでdb1データベースのtable1テーブルと、db2デー ...

サイズが大きめのMySQLデータをレンタルサーバに移行する方法
サイズが大きめのMySQLデータをレンタルサーバに移行する方法

お名前.comのレンタルサーバにそこそこ大きいサイズのMySQLデータを移行した ...