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カラムに増やすのもそれはそれで違う気がして悩ましいところ。
関連記事
-
-
htmlspecialcharsを通してMySQLに格納したものを元に戻して出力
MySQLにHTMLタグを入れたくない場合にhtmlspecialcharsを使 ...
-
-
MySQLでdatetime型にもインデックスを使用して高速化を図る方法
ログ関連のデータを格納するテーブルがあり、集計を行う際に非常に時間がかかった。レ ...
-
-
PHP / MySQLで2038年問題の対策
先日打ち合わせの際に「タイムスタンプを使ってユニークキーに云々~~」といったよう ...
-
-
MySQLにてdatetime型のカラムを整形し「年月日のみ形式」または「秒のみ省いた形式」で表示する方法
MySQLにてdatetime型のカラムに登録日時等を格納しており、管理画面側で ...
-
-
MySQLで「Incorrect integer value: '' for column」エラーの対応方法
MySQLで「Incorrect integer value: '' for c ...