MySQLで「01 August 2019」形式の日付を並べ替える方法
「01 August 2019」のように文字列として保存された日付を正しく並べ替えるには、ORDER BYとSTR_TO_DATE()関数を組み合わせて使用します。まずは、サンプル用のテーブルを作成しましょう。
テーブルの作成
日付をVARCHAR型のカラムに保存するテーブルを作成します。
mysql> create table DemoTable1435
-> (
-> DueDate varchar(60)
-> );
Query OK, 0 rows affected (1.08 sec)
レコードの挿入
INSERT文を使って、テーブルにいくつかのレコードを追加します。
mysql> insert into DemoTable1435 values('01 August 2019');
Query OK, 1 row affected (0.34 sec)
mysql> insert into DemoTable1435 values('01 Feb 2018');
Query OK, 1 row affected (0.16 sec)
mysql> insert into DemoTable1435 values('31 Jan 2017');
Query OK, 1 row affected (0.08 sec)
mysql> insert into DemoTable1435 values('01 March 2019');
Query OK, 1 row affected (0.11 sec)
登録データの確認
SELECT文ですべてのレコードを表示してみましょう。
mysql> select * from DemoTable1435;
実行結果は以下のとおりです。
+----------------+ | DueDate | +----------------+ | 01 August 2019 | | 01 Feb 2018 | | 31 Jan 2017 | | 01 March 2019 | +----------------+ 4 rows in set (0.00 sec)
日付を正しくソートするクエリ
「01 August 2019」形式の文字列をそのまま並べ替えると、文字列比較になってしまい意図した順序になりません。そこで、STR_TO_DATE()関数を使って文字列を日付型に変換してからソートします。
mysql> select * from DemoTable1435
-> order by str_to_date(DueDate,'%d %M %Y');
実行結果は以下のとおりです。
+----------------+ | DueDate | +----------------+ | 31 Jan 2017 | | 01 Feb 2018 | | 01 March 2019 | | 01 August 2019 | +----------------+ 4 rows in set (0.04 sec)
フォーマット指定子の解説
このクエリで使用している主なフォーマット指定子は以下のとおりです。
%d:日(2桁の数値)%M:月名(英語の完全名。省略形の「Feb」「Jan」なども自動的に認識されます)%Y:年(4桁の数値)
このようにSTR_TO_DATE()で文字列を日付に変換してからORDER BYに渡すことで、VARCHAR型で保存された日付データでも、年月日の順に正確にソートできるようになります。
-
MySQLで2つの日付の差を月単位で求める方法
MySQLで2つの日付の差を「月」単位で計算したい場合、TIMESTAMPDIFF()関数を使うと簡単に求められます。さらにABS()関数を組み合わせることで、日付の順序に関係なく常に正の値(絶対値)として結果を取得できます。本記事では、実際にテーブルを作成し、サンプルデータを使いながら具体的な手順を解説します。1. テーブルの作成まず、date型のカラムを2つ持つテーブルを作成しましょう。mysql> create table DemoTable -> ( -> Date1 date
-
MySQLクエリでテーブル列の日付形式を変更する方法
MySQLクエリでテーブル列の日付形式を変更する方法 MySQLでテーブルに保存された日付の表示形式を変更するには、DATE_FORMAT()関数を使用します。この記事では、サンプルテーブルを作成し、実際に日付形式を変換するまでの手順をサンプルコード付きでわかりやすく解説します。 1. サンプルテーブルの作成 まず、datetime型の列を持つテーブルを作成しましょう。 mysql> create table DemoTable1906 ( DueTime datetime ); Query OK, 0 rows affected (0.00 sec) 2.