Сортировка по дню недели

Задача
Вы хотите выполнить сортировку по дню недели.

Решение
Используйте функцию DAYOFWEEK() для преобразования столбца даты в соответствующее числовое значение дня недели.

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

Вы можете получить день недели, применяя DAYNAME(), но тогда на выходе будут строки, упорядоченные в лексическом порядке, а не как дни недели(воскресенье, понедельник, вторник и т. д.). Тут нам пригодится методика вывода одного значения, а упорядочивания по другому. Будем выводить названия дней при помощи функции DAYNAME(), а сортировать их в порядке дней недели будем посредством функции DAYOFWEEK(), которая возвращает числовые значения от 1 до 7 для дней с воскресенья по субботу:

mysql> SELECT DAYNAME(date) AS day, date, description
-> FROM event
-> ORDER BY DAYOFWEEK(date);

+----------+------------+-------------------------------------+
| day | date | description |
+------------+--------------+----------------------------------------+
| Sunday | 1776-07-14 | Bastille Day |
| Sunday | 1809-02-12 | Abraham Lincoln's birthday |
| Monday | 1215-06-15 | Signing of the Magna Carta |
| Tuesday | 1944-06-06 | D-Day at Normandy Beaches |
| Thursday | 1989-11-09 | Opening of the Berlin Wall |
| Friday | 1957-10-04 | Sputnik launch date |
| Friday | 1958-01-31 | Explorer 1 launch date |
| Friday | 1732-02-22 | George Washington's birthday |
| Saturday | 1789-07-04 | US Independence Day |
| Saturday | 1919-06-28 | Signing of the Treaty of Versailles |
+-----------+---------------+----------------------------------------+

Если вы хотите выполнить сортировку по дню недели, но так, чтобы первым днем недели считался понедельник, используйте функцию MOD() для сопоставления понедельнику значения 0, вторнику – 1, ..., воскресенью – 6:

mysql> SELECT DAYNAME(date), date, description
-> FROM event
-> ORDER BY MOD(DAYOFWEEK(date) + 5, 7);

+--------------------+--------------+----------------------------------------+
| DAYNAME(date) | date | description |
+-------------------+---------------+-----------------------------------------+
| Monday | 1215-06-15 | Signing of the Magna Carta |
| Tuesday | 1944-06-06 | D-Day at Normandy Beaches |
| Thursday | 1989-11-09 | Opening of the Berlin Wall |
| Friday | 1957-10-04 | Sputnik launch date |
| Friday | 1958-01-31 | Explorer 1 launch date |
| Friday | 1732-02-22 | George Washington's birthday |
| Saturday | 1789-07-04 | US Independence Day |
| Saturday | 1919-06-28 | Signing of the Treaty of Versailles |
| Sunday | 1776-07-14 | Bastille Day |
| Sunday | 1809-02-12 | Abraham Lincoln's birthday |
+--------------------+--------------+-----------------------------------------+

Любой день недели можно сделать первым в упорядоченном списке.

Для сортировки по дню недели можно использовать и функцию WEEKDAY(), помня, что она возвращает другой набор значений (0 для понедельника, …, 6 – для воскресенья)..



Оцените статью: (0 голосов)
0 5 0

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