MySQL / 6. Сортировка результатов запроса

Сортировка по дате

Задача
Вы хотите произвести упорядочивание по временному значению.

Решение
Сортируйте по столбцу даты или времени, при необходимости игнорируя ненужные составляющие значений.

Обсуждение
Многие сведения включают в себя информацию о дате или времени, и нередко требуется упорядочить результаты в хронологическом порядке. MySQL умеет упорядочивать временные типы, так что не приходится прибегать к каким-то ухищрениям, чтобы отсортировать значения столбцов DATE, DATETIME, TIME или TIMESTAMP. Пусть некоторая таблица содержит столбцы всех этих типов:

mysql> SELECT * FROM temporal_val;

+--------------+--------------------------+------------+---------------------+
| d                  | dt                                | t              | ts                          |
+--------------+--------------------------+------------+---------------------+
| 1970-01-01 | 1884-01-01 12:00:00 | 13:00:00 | 19800101020000 |
| 1999-01-01 | 1860-01-01 12:00:00 | 19:00:00 | 20210101030000 |
| 1981-01-01 | 1871-01-01 12:00:00 | 03:00:00 | 19750101040000 |
| 1964-01-01 | 1899-01-01 12:00:00 | 01:00:00 | 19850101050000 |
+--------------+--------------------------+------------+---------------------+

Используем инструкцию ORDER BY для упорядочивания каждого из столбцов в нужном направлении:

mysql> SELECT * FROM temporal_val ORDER BY d;

+--------------+---------------------------+-----------+---------------------+
| d                  | dt                                | t              | ts                          |
+--------------+--------------------------+------------+---------------------+
| 1964-01-01 | 1899-01-01 12:00:00 | 01:00:00 | 19850101050000 |
| 1970-01-01 | 1884-01-01 12:00:00 | 13:00:00 | 19800101020000 |
| 1981-01-01 | 1871-01-01 12:00:00 | 03:00:00 | 19750101040000 |
| 1999-01-01 | 1860-01-01 12:00:00 | 19:00:00 | 20210101030000 |
+--------------+--------------------------+------------+---------------------+

mysql> SELECT * FROM temporal_val ORDER BY dt;

+--------------+--------------------------+------------+---------------------+
| d                  | dt                                | t              | ts                          |
+--------------+--------------------------+------------+---------------------+
| 1999-01-01 | 1860-01-01 12:00:00 | 19:00:00 | 20210101030000 |
| 1981-01-01 | 1871-01-01 12:00:00 | 03:00:00 | 19750101040000 |
| 1970-01-01 | 1884-01-01 12:00:00 | 13:00:00 | 19800101020000 |
| 1964-01-01 | 1899-01-01 12:00:00 | 01:00:00 | 19850101050000 |
+--------------+--------------------------+------------+---------------------+

mysql> SELECT * FROM temporal_val ORDER BY t;

+--------------+--------------------------+------------+---------------------+
| d                  | dt                                | t              | ts                          |
+--------------+--------------------------+------------+---------------------+
| 1964-01-01 | 1899-01-01 12:00:00 | 01:00:00 | 19850101050000 |
| 1981-01-01 | 1871-01-01 12:00:00 | 03:00:00 | 19750101040000 |
| 1970-01-01 | 1884-01-01 12:00:00 | 13:00:00 | 19800101020000 |
| 1999-01-01 | 1860-01-01 12:00:00 | 19:00:00 | 20210101030000 |
+--------------+--------------------------+------------+---------------------+

mysql> SELECT * FROM temporal_val ORDER BY ts;

+--------------+--------------------------+------------+---------------------+
| d                  | dt                                | t              | ts                          |
+--------------+--------------------------+------------+---------------------+
| 1981-01-01 | 1871-01-01 12:00:00 | 03:00:00 | 19750101040000 |
| 1970-01-01 | 1884-01-01 12:00:00 | 13:00:00 | 19800101020000 |
| 1964-01-01 | 1899-01-01 12:00:00 | 01:00:00 | 19850101050000 |
| 1999-01-01 | 1860-01-01 12:00:00 | 19:00:00 | 20210101030000 |
+--------------+--------------------------+------------+---------------------+

Иногда сортировка использует только часть даты или времени. В этом случае можно выделить необходимую составляющую (или составляющие) и работать только с ними.

Статьи по MySQL на эту тему:

Размещение некоторых значений в начале или конце упорядоченного списка
Сортировка IP-адресов в числовом порядке
Сортировка в порядке, определенном пользователем
Сортировка значений ENUM
Сортировка имен хостов по доменам