Проблем:
Искате да сортирате редовете по номер на месец, като са дадени имена на месеци (искате януари да се показва първи, декември последен).
Пример:
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 четвърто).