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

MySQLでDD/MM/YYYY形式の日付をSELECTして降順に並べ替える方法

MySQLでは、SELECTORDER BY ... DESCを組み合わせることで、DD/MM/YYYY形式で保存された日付文字列を正しく日付として解釈し、新しい順(降順)に並べ替えて取得できます。基本となる構文は以下の通りです。

SELECT *FROM yourTableName
where yourDatetimeColumnName order by
STR_TO_DATE(yourDatetimeColumnName,'%d/%m%Y') desc;

ここでのポイントはSTR_TO_DATE()関数です。「日/月/年」形式の文字列をMySQLが認識できる日付値に変換してくれるため、単純な文字列比較ではなく、正しい日付順でソートできます。

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

上記の構文は日付を降順で返します。実際の動きを理解するために、まずテーブルを作成してみましょう。テーブル作成用のクエリは以下の通りです。

mysql> create table DateFormatWithSelect
    -> (
    -> UserId int,
    -> UserName varchar(100),
    -> UserLoginDatetime varchar(100)
    -> );
Query OK, 0 rows affected (0.58 sec)

データの挿入

次に、INSERTコマンドを使ってテーブルにいくつかレコードを追加します。

mysql> insert into DateFormatWithSelect values(101,'John','20/10/2016');
Query OK, 1 row affected (0.11 sec)

mysql> insert into DateFormatWithSelect values(102,'David','21/09/2015');
Query OK, 1 row affected (0.20 sec)

mysql> insert into DateFormatWithSelect values(103,'Carol','21/12/2018');
Query OK, 1 row affected (0.10 sec)

mysql> insert into DateFormatWithSelect values(104,'Mike','2/8/2014');
Query OK, 1 row affected (0.16 sec)

mysql> insert into DateFormatWithSelect values(105,'Sam','21/11/2017');
Query OK, 1 row affected (0.12 sec)

mysql> insert into DateFormatWithSelect values(106,'Bob','21/12/2013');
Query OK, 1 row affected (0.18 sec)

登録データの確認

SELECTコマンドでテーブル内のすべてのレコードを表示してみます。

mysql> select *from DateFormatWithSelect;

実行結果は以下の通りです。

+--------+----------+-------------------+
| UserId | UserName | UserLoginDatetime |
+--------+----------+-------------------+
|   101 | John     | 20/10/2016       |
|   102 | David    | 21/09/2015       |
|   103 | Carol    | 21/12/2018       |
|   104 | Mike     | 2/8/2014        |
|   105 | Sam      | 21/11/2017       |
|   106 | Bob      | 21/12/2013       |
+--------+----------+-------------------+
6 rows in set (0.00 sec)

DD/MM/YYYY形式の日付で降順ソートするSELECT文

いよいよ本題です。次のSELECT文では、STR_TO_DATE()によって日付文字列を日付値として解釈し、降順に並べ替えています。

mysql> select *from DateFormatWithSelect
    -> where UserLoginDatetime order by str_to_date(UserLoginDatetime,'%d/%m/%Y') desc;

出力結果

+--------+----------+-------------------+
| UserId | UserName | UserLoginDatetime |
+--------+----------+-------------------+
|   103 | Carol    | 21/12/2018       |
|   105 | Sam      | 21/11/2017       |
|   101 | John     | 20/10/2016       |
|   102 | David    | 21/09/2015        |
|   104 | Mike     | 2/8/2014          |
|   106 | Bob      | 21/12/2013        |
+--------+----------+-------------------+
6 rows in set, 6 warnings (0.00 sec)

ご覧のとおり、最新の「21/12/2018」から最も古い「21/12/2013」まで、日付順に正しく降順ソートされていることが確認できます。

補足:注意点

今回のように日付をVARCHAR型の文字列として保存している場合、変換時に警告(warnings)が表示されることがあります。また、「2/8/2014」のようなゼロ埋めされていない日付も正しく処理されますが、実運用ではDATE型カラムを使い、日付は標準形式(YYYY-MM-DD)で保存しておくことをおすすめします。その方がインデックスも有効に機能し、検索性能の面でも有利になります。

  1. MySQLでdd/mm/yyyy形式の文字列をUnixタイムスタンプに変換する方法

    dd/mm/yyyy形式の文字列をUnixタイムスタンプへ変換する方法 MySQLでは、UNIX_TIMESTAMP()関数とSTR_TO_DATE()関数を組み合わせることで、「dd/mm/yyyy」(日/月/年)形式の日付文字列をUnixタイムスタンプに変換できます。基本構文は以下の通りです。 SELECT UNIX_TIMESTAMP(STR_TO_DATE(yourColumnName,%d/%m/%Y)) as anyVariableName FROM yourTableName; STR_TO_DATE()がフォーマット指定子「%d/%m/%Y」に従って文字列をDATE型に変換し、

  2. PHP・MySQLで日付形式をdd/mm/yyyyに変更する方法

    PHPやMySQLでは、日付の表示形式を自由に変更できます。本記事では、日付を「dd/mm/yyyy(日/月/年)」形式に変換する方法を、PHPとMySQLそれぞれのケースについて解説します。PHPで日付形式を変更する方法PHPでは、date()関数を使って日付形式を簡単に変更できます。基本構文は以下の通りです。date(d/m/Y, 日時の変数);また、文字列を日付として扱う場合は、strtotime()関数を使用します。この関数は、日付を表す文字列をUnixタイムスタンプに変換してくれるため、date()関数と組み合わせて使うのが一般的です。以下は、日時を「dd/mm/yyyy」形式に整形