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

MySQLでVARCHAR型として保存された日付に対してSELECTを実行する方法

MySQLでは、日付がVARCHAR型(文字列)として保存されている場合でも、STR_TO_DATE()関数を使えば日付として比較・検索することができます。本記事では、VARCHAR型の日付カラムを持つテーブルを作成し、実際にSELECTクエリで条件を指定してレコードを取得する手順を解説します。

テーブルの作成

まず、日付をVARCHAR型で格納するテーブルを作成しましょう。

mysql> create table DemoTable
(
    DueDate varchar(100)
);
Query OK, 0 rows affected (0.50 sec)

レコードの挿入

次に、INSERTコマンドを使用してサンプルとなるレコードをいくつか挿入します。ここでは「日/月/年」形式の文字列として日付を登録しています。

mysql> insert into DemoTable values('21/10/2018');
Query OK, 1 row affected (0.22 sec)
mysql> insert into DemoTable values('18/08/2019');
Query OK, 1 row affected (0.10 sec)
mysql> insert into DemoTable values('01/12/2012');
Query OK, 1 row affected (0.18 sec)
mysql> insert into DemoTable values('31/01/2016');
Query OK, 1 row affected (0.19 sec)

すべてのレコードを表示する

SELECT文を使って、テーブル内の全レコードを表示してみましょう。

mysql> select *from DemoTable;

上記のクエリを実行すると、次のような出力が得られます。

+------------+
| DueDate    |
+------------+
| 21/10/2018 |
| 18/08/2019 |
| 01/12/2012 |
| 31/01/2016 |
+------------+
4 rows in set (0.00 sec)

VARCHAR型の日付に対するSELECTクエリ

VARCHAR型として保存された日付を比較するには、STR_TO_DATE()関数を使って文字列を日付値に変換します。以下は、2010年1月31日より後の日付を持つすべてのレコードを取得するクエリの例です。

mysql> select *from DemoTable where str_to_date(DueDate,'%d/%m/%Y') > '2010-01-31';

このクエリを実行すると、以下の出力が得られます。

+------------+
| DueDate    |
+------------+
| 21/10/2018 |
| 18/08/2019 |
| 01/12/2012 |
| 31/01/2016 |
+------------+
4 rows in set (0.00 sec)

ポイント:フォーマット指定子について

STR_TO_DATE()関数の第2引数には、元の文字列の日付形式に対応したフォーマット指定子を指定します。今回の例では「日/月/年」形式で保存されているため、「%d/%m/%Y」を指定しています。主な指定子は以下の通りです。

  • %d … 日(01〜31)
  • %m … 月(01〜12)
  • %Y … 4桁の年(例:2018)

補足:パフォーマンスに関する注意点

WHERE句の中でSTR_TO_DATE()のような関数を使用すると、インデックスが利用できず、大量データの場合は検索が遅くなる可能性があります。可能であれば、日付はDATE型やDATETIME型のカラムに保存しておくことをおすすめします。そうすれば変換処理が不要になり、インデックスも活用できるため、クエリの実行性能が大幅に向上します。

  1. MySQLでテーブルに存在しない値だけを抽出する方法(UNION ALLとNOT EXISTSの活用)

    MySQLでテーブルに存在しない値を照会するには? MySQLで「テーブルにまだ登録されていない値だけ」を取得したい場合、UNION ALLとWHERE NOT EXISTSを組み合わせるのが有効です。サブクエリで候補となる値をUNION ALLで列挙し、NOT EXISTSによって既にテーブル内に存在する値を除外することで、存在しない値のみを抽出できます。 ここでは、実際の手順をサンプルコードとともに解説します。 1. サンプルテーブルを作成する まず、自動採番(AUTO_INCREMENT)のカラムを持つテーブルを作成します。 mysql> create table DemoTab

  2. MySQLのINSERT INTO SELECT構文でAUTO_INCREMENTテーブルにデータを挿入する方法

    はじめにMySQLでは、INSERT INTO ... SELECT構文を使うことで、SELECT文の結果をそのまま別のテーブルへ挿入できます。AUTO_INCREMENT列を持つテーブルに対しても、SELECT句で明示的に値を指定すれば、任意のIDを設定した状態で挿入が可能です。本記事では、AUTO_INCREMENT主キーを持つテーブルに、INSERT INTO SELECT文で具体的な値を挿入する手順を、サンプルコードと実行結果とともに解説します。テーブルの作成まず、次のようにテーブルを作成します。mysql> create table DemoTable1923 &nb