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