Проблем:
Искате да сортирате редовете по номер на месец, като са дадени имена на месеци (искате януари да се показва първи, декември последен).
Пример:
birthday
таблицата съдържа две колони:име и birthday_month
. Месеците са дадени в имена, а не в числа.p>
name | рожден_месец |
---|---|
Ронан Тиша | NULL |
Декември | 2020 |
Анджи Джулия | Април |
Нарел Дилън | Април |
Пърди Кейси | Януари |
Дона Нел | NULL |
Блейз Грейм | октомври |
Искате да сортирате редовете по birthday_month
.
Решение:
SELECT * FROM birthday ORDER BY STR_TO_DATE(CONCAT('0001 ', birthday_month, ' 01'), '%Y %M %d');
Резултатът изглежда така:
name | рожден_месец |
---|---|
Дона Нел | NULL |
Пърди Кейси | Януари |
Анджи Джулия | Април |
Нарел Дилън | Април |
Блейз Грейм | октомври |
Ронан Тиша | NULL |
Декември | октомври |
Дискусия:
За да поръчате по месеци, създайте дата с този месец. За да направите това, използвайте функцията STR_TO_DATE(). Ако имате дата, съхранена като низ в 'Year Month Day
' формат, можете да го прехвърлите към дата, като използвате STR_TO_DATE(date_string, '%Y %M %d')
.
Първо, трябва да създадете низ с помощта на функцията CONCAT(). Годината може да бъде всяка година, която искате (напр. 0001
) и денят може да бъде всеки ден, който искате (напр. 01
):
CONCAT('0001 ', birthday_month, ' 01')
CONCAT()
функцията комбинира всички аргументи в един низ. Низът трябва да бъде в „Year Month Day
' формат, така че вторият аргумент трябва да бъде birthday_month
; просто първият и третият аргумент трябва да са в правилните формати.
След това трябва да преобразувате този низ в дата, като използвате STR_TO_DATE(date_string, '%Y %M %d')
функция. Вторият аргумент на тази функция е форматът на датата. %Y
означава година, %M
означава месец (пълното му име, а не число) и %d
означава ден.
STR_TO_DATE(CONCAT('0001 ', birthday_month, ' 01'), '%Y %M %d')
Използвайте го с ORDER BY
клауза за сортиране на редовете във възходящ ред по дата. Ако искате да видите редовете в низходящ ред, просто добавете DESC
ключова дума, като тази:
SELECT * FROM birthday ORDER BY STR_TO_DATE(CONCAT('0001 ', birthday_month, ' 01'), '%Y %M %d') DESC;
Имайте предвид, че в MySQL NULL
s се показват първи при сортиране във възходящ ред и последни при сортиране в низходящ ред. Също така редовете със същия birthday_month
се показват в произволен ред (може да видите Angie Julia
трети и Narelle Dillan
четвърто, или Narelle Dillan
трети и Angie Julia
четвърто).