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

MySQLのORDER BY句で日付と時刻の両方を基準にレコードを並べ替える方法

MySQLで日付と時刻を組み合わせてレコードを並べ替えるには、ORDER BY句を使用します。カンマ区切りで複数のカラムを指定すると、最初に指定したカラム(日付)でソートされ、同じ値を持つレコード同士は2番目のカラム(時刻)でさらにソートされます。

1. サンプルテーブルの作成

まず、配送日(ShippingDate)と配送時刻(ShippingTime)を格納するテーブルを作成します。テーブル作成のクエリは以下の通りです。

mysql> create table OrderByDateThenTimeDemo
   -> (
   -> Id int NOT NULL AUTO_INCREMENT PRIMARY KEY,
   -> ShippingDate date,
   -> ShippingTime time
   -> );
Query OK, 0 rows affected (0.56 sec)

2. テストデータの挿入

次に、INSERT文でレコードを挿入します。ここでは、同じ日付「2018-01-24」でも時刻が異なるデータをあえて含めており、これにより時刻での二次ソートの効果を確認できます。

mysql> insert into OrderByDateThenTimeDemo(ShippingDate,ShippingTime) values('2018-01-24','16:45:40');
Query OK, 1 row affected (0.13 sec)
mysql> insert into OrderByDateThenTimeDemo(ShippingDate,ShippingTime) values('2018-01-24','15:30:35');
Query OK, 1 row affected (0.22 sec)
mysql> insert into OrderByDateThenTimeDemo(ShippingDate,ShippingTime) values('2018-04-25','14:20:25');
Query OK, 1 row affected (0.24 sec)
mysql> insert into OrderByDateThenTimeDemo(ShippingDate,ShippingTime) values('2019-02-14','18:07:55');
Query OK, 1 row affected (0.13 sec)
mysql> insert into OrderByDateThenTimeDemo(ShippingDate,ShippingTime) values('2019-01-31','20:20:30');
Query OK, 1 row affected (0.26 sec)

3. 挿入したレコードの確認

SELECT文ですべてのレコードを表示してみましょう。クエリは以下の通りです。

mysql> select *from OrderByDateThenTimeDemo;

実行結果は次のようになります。

+----+--------------+--------------+
| Id | ShippingDate | ShippingTime |
+----+--------------+--------------+
|  1 | 2018-01-24   | 16:45:40     |
|  2 | 2018-01-24   | 15:30:35     |
|  3 | 2018-04-25   | 14:20:25     |
|  4 | 2019-02-14   | 18:07:55     |
|  5 | 2019-01-31   | 20:20:30     |
+----+--------------+--------------+
5 rows in set (0.00 sec)

この段階では、挿入した順序のまま表示されており、日付や時刻の順番にはなっていません。

4. 日付と時刻で並べ替えるクエリ

ここが本題です。日付と時刻の両方を基準に並べ替えるには、ORDER BY句に「ShippingDate, ShippingTime」の順でカラムを指定します。こうすることで、まず日付が昇順にソートされ、同じ日付を持つレコードは時刻の昇順でさらにソートされます。

mysql> select *from OrderByDateThenTimeDemo order by ShippingDate,ShippingTime;

実行結果を見てみましょう。

+----+--------------+--------------+
| Id | ShippingDate | ShippingTime |
+----+--------------+--------------+
|  2 | 2018-01-24   | 15:30:35     |
|  1 | 2018-01-24   | 16:45:40     |
|  3 | 2018-04-25   | 14:20:25     |
|  5 | 2019-01-31   | 20:20:30     |
|  4 | 2019-02-14   | 18:07:55     |
+----+--------------+--------------+
5 rows in set (0.00 sec)

注目すべきは日付「2018-01-24」の2件です。時刻が15:30:35 → 16:45:40の順に正しく並べ替えられていることがわかります。このように、ORDER BY句に複数のカラムを指定すれば、日付でグループ化された中で時刻順に整列させることができます。

補足:降順で並べ替えたい場合

ORDER BY句はデフォルトで昇順(ASC)ですが、降順にしたい場合はDESCキーワードを指定します。たとえば、新しい日付・遅い時刻から表示したい場合は次のように書きます。

mysql> select *from OrderByDateThenTimeDemo
    -> order by ShippingDate DESC, ShippingTime DESC;

また、日付は昇順・時刻だけ降順といった混在した指定も可能です。用途に応じてASC/DESCを使い分けることで、柔軟なデータ取得が実現できます。

  1. MySQLで0を末尾に回して並べ替える!条件付きSELECTとORDER BYの使い方

    MySQLでは、ORDER BY句に「カラム名=0」という条件式を組み合わせることで、0以外の値を昇順に並べたうえで、0のレコードだけを末尾にまとめて表示できます。この記事では、その具体的な書き方と実行例を分かりやすく解説します。基本構文select * from yourTableName order by yourColumnName=0, yourColumnName;この構文のポイントは、yourColumnName=0 がブール値として評価される点です。値が0であれば「1(真)」、0以外であれば「0(偽)」となるため、昇順ソートでは0以外の値の行が先に並び、その後ろに0の行が配置され

  2. MySQLで時間差を取得するクエリの書き方を解説

    MySQLで現在時刻との時間差を取得する方法MySQLでは、NOW() 関数と INTERVAL を組み合わせることで、「現在時刻から一定時間以内」のレコードを簡単に抽出できます。ここでは、現在時刻から5時間以内に到着したデータを取得するクエリを例に、その手順を解説します。1. サンプルテーブルの作成まず、日時を格納するカラムを持つテーブルを作成します。mysql> create table DemoTable1570    -> (    -> ArrivalTime datetime