【MySQL】日付がVARCHAR形式のカラムから特定のレコードを抽出する方法|STR_TO_DATE()の使い方
テーブルのカラムに保存されている日付がVARCHAR型(文字列)の場合、そのままでは日付として比較することができません。このようなケースでは、STR_TO_DATE()関数を使って文字列を日付値に変換してから比較することで、特定のレコードを正確に抽出できます。
1. テーブルの作成
まず、日付をVARCHAR型で格納するサンプルテーブルを作成しましょう。
mysql> create table DemoTable
(
DueDate varchar(60)
);
Query OK, 0 rows affected (0.71 sec)
2. サンプルデータの挿入
INSERTコマンドを使って、「DD-MON-YYYY」形式の日付文字列を複数件登録します。
mysql> insert into DemoTable values('12-AUG-2016');
Query OK, 1 row affected (0.11 sec)
mysql> insert into DemoTable values('14-AUG-2018');
Query OK, 1 row affected (0.11 sec)
mysql> insert into DemoTable values('24-AUG-2012');
Query OK, 1 row affected (0.10 sec)
mysql> insert into DemoTable values('14-AUG-2012');
Query OK, 1 row affected (0.19 sec)
3. 登録されたデータの確認
SELECT文でテーブル内のすべてのレコードを表示してみます。
mysql> select *from DemoTable;
実行すると、次のような結果が得られます。
+-------------+ | DueDate | +-------------+ | 12-AUG-2016 | | 14-AUG-2018 | | 24-AUG-2012 | | 14-AUG-2012 | +-------------+ 4 rows in set (0.00 sec)
4. STR_TO_DATE()で特定の日付のレコードを抽出する
日付がVARCHAR形式で保存されていても、STR_TO_DATE()関数で文字列をDATE型に変換すれば、通常の日付比較と同じ要領で条件を指定できます。以下のクエリでは、「14-AUG-2012」と一致するレコードだけを取り出しています。
mysql> select *from DemoTable
where str_to_date(DueDate,'%d-%M-%Y') = str_to_date('14-AUG-2012','%d-%M-%Y');
実行結果:
+-------------+ | DueDate | +-------------+ | 14-AUG-2012 | +-------------+ 1 row in set (0.00 sec)
このように、該当する1件のレコードのみが正しく抽出されました。
書式指定子の意味
STR_TO_DATE()の第2引数には、元の文字列の形式に合わせたフォーマットを指定します。
- %d:日(01〜31)
- %M:月名(January、February など英語の完全な月名)
- %Y:4桁の年(例:2012)
たとえば「12/08/2016」のようにスラッシュ区切りの文字列であれば、「'%d/%m/%Y'」のように指定子を組み合わせて記述します。
補足:パフォーマンスに関する注意点
WHERE句内でカラムに対してSTR_TO_DATE()を実行すると、インデックスが活用されず、データ量が多い場合は検索速度が低下する可能性があります。本番環境では、日付用カラムをあらかじめDATE型やDATETIME型で定義しておくのがベストプラクティスです。既存テーブルを変更できる場合は、ALTER TABLEでカラム型を変更するか、変換後の値を保持する生成カラム(GENERATED COLUMN)にインデックスを設定する方法も有効です。
-
MySQLでテーブルの最後の10件のレコードを取得する方法
MySQLでテーブルの末尾にある10行(最新の10件)を取得したい場合は、SELECT文とLIMIT句を組み合わせたサブクエリを利用します。この記事では、実際にテーブルを作成し、データを挿入しながら、最後の10件を取得するクエリの手順を具体的に解説します。 1. サンプルテーブルの作成 まず、動作確認用のテーブルを作成します。 mysql> create table Last10RecordsDemo -> ( -> id int, -> name varchar(100) -> ); Query OK, 0 rows affected
-
MySQLで日付形式を変換する方法|STR_TO_DATE()関数の使い方を解説
MySQLでは、VARCHAR型などで保存された文字列の日付データを、正しい日付・時刻形式に変換したいケースがよくあります。そんなときに活躍するのが STR_TO_DATE() 関数です。この記事では、実際のSQL例とともに具体的な使い方を解説します。サンプルテーブルの作成まず、日付を文字列として格納するテーブルを作成します。mysql> create table DemoTable2010 ( DueDate varchar(20) ); Query OK, 0 rows affected (0.68 sec)テストデータの挿入INSERT文を使って、「日/月/年 時:分:秒」