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

【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)にインデックスを設定する方法も有効です。

  1. MySQLでテーブルの最後の10件のレコードを取得する方法

    MySQLでテーブルの末尾にある10行(最新の10件)を取得したい場合は、SELECT文とLIMIT句を組み合わせたサブクエリを利用します。この記事では、実際にテーブルを作成し、データを挿入しながら、最後の10件を取得するクエリの手順を具体的に解説します。 1. サンプルテーブルの作成 まず、動作確認用のテーブルを作成します。 mysql> create table Last10RecordsDemo -> ( -> id int, -> name varchar(100) -> ); Query OK, 0 rows affected

  2. 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文を使って、「日/月/年 時:分:秒」