【MySQL】varchar型で保存された日付の範囲を検索する方法(STR_TO_DATE活用)
varchar型の日付データを範囲検索するには?
MySQLでは、STR_TO_DATE() 関数を使うことで、varchar型(文字列)として保存されている日付データを日付値に変換し、BETWEEN句で範囲検索することができます。
基本の構文は以下のとおりです。
SELECT * FROM テーブル名
WHERE STR_TO_DATE(LEFT(カラム名, LOCATE(' ', カラム名)), '%m/%d/%Y')
BETWEEN '開始日' AND '終了日';
構文のポイント
- LEFT() + LOCATE():文字列から日付部分のみを抽出します(時刻部分を除外)。
- STR_TO_DATE():抽出した文字列を指定フォーマット(ここでは
%m/%d/%Y=月/日/年)で日付型に変換します。 - BETWEEN:変換後の日付が指定範囲内かどうかを判定します。
実際にテーブルを作成して検証する
まず、サンプル用のテーブルを作成します。
mysql> create table SearchDateAsVarchar
-> (
-> Id int NOT NULL AUTO_INCREMENT,
-> ShippingDate varchar(100),
-> PRIMARY KEY(Id)
-> );
Query OK, 0 rows affected (0.99 sec)
次に、INSERTコマンドでいくつかのレコードを挿入します。ShippingDateカラムには「月/日/年 時:分 AM」形式の文字列が格納されています。
mysql> insert into SearchDateAsVarchar(ShippingDate) values('6/28/2011 9:58 AM');
Query OK, 1 row affected (0.19 sec)
mysql> insert into SearchDateAsVarchar(ShippingDate) values('6/18/2011 10:50:39 AM');
Query OK, 1 row affected (0.55 sec)
mysql> insert into SearchDateAsVarchar(ShippingDate) values('6/22/2011 11:45:40 AM');
Query OK, 1 row affected (0.18 sec)SELECT文ですべてのレコードを確認してみましょう。
mysql> select *from SearchDateAsVarchar;
実行結果は以下のとおりです。
+----+-----------------------+
| Id | ShippingDate |
+----+-----------------------+
| 1 | 6/28/2011 9:58 AM |
| 2 | 6/18/2011 10:50:39 AM |
| 3 | 6/22/2011 11:45:40 AM |
+----+-----------------------+
3 rows in set (0.00 sec)
varchar型の日付を範囲検索するクエリ
それでは、2011年6月20日から6月28日までの範囲に該当するレコードを検索してみます。
mysql> select *from SearchDateAsVarchar where
STR_TO_DATE(LEFT(ShippingDate,LOCATE(' ',ShippingDate)),'%m/%d/%Y') BETWEEN
'2011-06-20' AND '2011-06-28';
実行結果は以下のとおりです。
+----+-----------------------+
| Id | ShippingDate |
+----+-----------------------+
| 1 | 6/28/2011 9:58 AM |
| 3 | 6/22/2011 11:45:40 AM |
+----+-----------------------+
2 rows in set (0.00 sec)
このように、Id 1(6月28日)と Id 3(6月22日)の2件が正しく抽出されました。Id 2(6月18日)は範囲外のため除外されています。
補足:パフォーマンスに関する注意点
STR_TO_DATE() をWHERE句内で使用すると、各行ごとに関数処理が行われるためインデックスが利用できず、大量データの場合はパフォーマンスが低下する可能性があります。運用環境では、可能であればカラムを DATETIME 型や DATE 型に変更することをおすすめします。どうしても文字列のまま扱う必要がある場合は、生成カラム(Generated Column)+インデックスの活用も検討しましょう。
-
MySQLで2つの日付の間を検索する方法|BETWEEN句の使い方を実例で解説
MySQLで2つの日付の間を検索するには?MySQLで特定の2つの日付の間に該当するレコードを検索したい場合は、BETWEENキーワードを使用します。本記事では、サンプルテーブルの作成からデータの挿入、そしてBETWEEN句を使った日付範囲検索まで、具体的な手順を順番に解説していきます。1. サンプルテーブルの作成まず、顧客名とオファー期間(開始日・終了日)を管理するテーブルを作成しましょう。mysql> create table DemoTable1456 -> ( -> Custo
-
MySQLストアドプロシージャでDELETEクエリを実装する方法
MySQLストアドプロシージャでDELETEクエリを実装する方法MySQLのストアドプロシージャを利用すれば、削除処理をひとつにまとめて再利用しやすくなり、パラメータを通じて動的に値を渡すことも可能です。ここでは、実際にサンプルテーブルを作成し、ストアドプロシージャ内でDELETEクエリを実行するまでの手順を解説します。1. サンプルテーブルの作成まず、動作確認用のテーブルを作成しましょう。mysql> create table DemoTable1464 -> ( -> Id int, -> Fi