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型のカラムに保存しておくことをおすすめします。そうすれば変換処理が不要になり、インデックスも活用できるため、クエリの実行性能が大幅に向上します。
-
MySQLでテーブルに存在しない値だけを抽出する方法(UNION ALLとNOT EXISTSの活用)
MySQLでテーブルに存在しない値を照会するには? MySQLで「テーブルにまだ登録されていない値だけ」を取得したい場合、UNION ALLとWHERE NOT EXISTSを組み合わせるのが有効です。サブクエリで候補となる値をUNION ALLで列挙し、NOT EXISTSによって既にテーブル内に存在する値を除外することで、存在しない値のみを抽出できます。 ここでは、実際の手順をサンプルコードとともに解説します。 1. サンプルテーブルを作成する まず、自動採番(AUTO_INCREMENT)のカラムを持つテーブルを作成します。 mysql> create table DemoTab
-
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