MySQLでVARCHAR型の列に保存された日付から、特定の日付より後のレコードを検索する方法
日付データがVARCHAR型として保存されている場合でも、STR_TO_DATE()関数を活用すれば、特定の日付より後のレコードを正確に検索できます。この記事では、実際のSQL例を通じてその手順をわかりやすく解説します。
1. テーブルの作成
まず、日付をVARCHAR型として格納するテーブルを作成します。
mysql> create table DemoTable1364
-> (
-> ShippingDate varchar(100)
-> );
Query OK, 0 rows affected (0.87 sec)
2. レコードの挿入
次に、INSERT文を使ってサンプルデータを挿入します。ここでは「日-月-年 時:分:秒」形式(dd-mm-yyyy hh:mm:ss)の日付文字列を使用しています。
mysql> insert into DemoTable1364 values('01-09-2019 12:34:55');
Query OK, 1 row affected (0.17 sec)
mysql> insert into DemoTable1364 values('01-07-2018 17:10:00');
Query OK, 1 row affected (0.37 sec)
mysql> insert into DemoTable1364 values('24-09-2019 10:31:22');
Query OK, 1 row affected (0.24 sec)
mysql> insert into DemoTable1364 values('20-09-2018 13:00:00');
Query OK, 1 row affected (0.13 sec)3. テーブル内の全レコードを確認
SELECT文で登録されたデータを確認してみましょう。
mysql> select * from DemoTable1364;
実行結果は以下のとおりです。
+---------------------+
| ShippingDate |
+---------------------+
| 01-09-2019 12:34:55 |
| 01-07-2018 17:10:00 |
| 24-09-2019 10:31:22 |
| 20-09-2018 13:00:00 |
+---------------------+
4 rows in set (0.00 sec)
4. 特定の日付より後のレコードを検索するクエリ
VARCHAR型の列に保存された日付は、そのまま比較すると文字列として扱われるため、意図した結果になりません。そこでSTR_TO_DATE()関数を使い、文字列を日時型に変換してから比較します。
以下は、「2019年9月21日 10:31:20」より後の日付レコードを抽出するクエリです。
mysql> select * from DemoTable1364
-> where str_to_date(ShippingDate,'%d-%m-%Y %H:%i:%s') > str_to_date('2019-09-21 10:31:20', '%Y-%m-%d %H:%i:%s');
実行結果:
+---------------------+
| ShippingDate |
+---------------------+
| 24-09-2019 10:31:22 |
+---------------------+
1 row in set (0.00 sec)
ポイント解説
- %d-%m-%Y %H:%i:%s:元データのフォーマット(日-月-年 時:分:秒)に対応する書式指定子です。
- %Y-%m-%d %H:%i:%s:比較対象の日付文字列のフォーマットです。
- STR_TO_DATE()で両方の日付を正しく変換することで、日時としての大小比較が可能になります。
なお、パフォーマンスの観点からは、日付カラムは本来DATETIME型やDATE型で定義するのが望ましいです。既存システムの都合でVARCHAR型を使わざるを得ない場合でも、上記のようにSTR_TO_DATE()関数を組み合わせれば柔軟に検索処理を実現できます。
-
MySQLでカンマ区切りの値を持つ列から特定のレコードを検索する方法
MySQLでは、カンマ区切りで複数の値が格納された列から特定の値を含むレコードを抽出したいケースがあります。そんなときに便利なのが FIND_IN_SET() 関数です。この関数を使うと、カンマ区切りの文字列の中に指定した値が存在するかどうかを簡単に判定できます。この記事では、実際にテーブルを作成し、FIND_IN_SET() を使って特定のレコードを検索する手順を解説します。1. テーブルの作成まず、カンマ区切りの値を格納するためのテーブルを作成します。mysql> create table DemoTable -> ( -> ListOfValue varch
-
MySQLのVARCHAR型カラムから最大値を正しく取得する方法
VARCHAR型(文字列型)のカラムに対してそのまま MAX() 関数を使用すると、値は文字列として比較されるため、「8」「901」「10001」のような数値的な大小関係が正しく評価されません。そこで、CAST() を使って値を数値型に変換してから MAX() を適用することで、正確な最大値を取得できます。 1. サンプルテーブルを作成する まず、動作確認用のテーブルを作成しましょう。 mysql> create table DemoTable2030 -> ( -> Value varchar(20) -> ); Query OK, 0 row