Проблем:
Искате да сортирате редовете по дата.
Пример 1:
exam
таблицата има две колони, subject
и exam_date
.
предмет | дата_изпит |
---|---|
Математика | 19.12.2019 |
английски | 08.01.2020 |
Наука | 2020-01-05 |
Здраве | 2020-01-05 |
Изкуство | NULL |
Искате да сортирате редовете по exam_date
.
Решение:
SELECT * FROM exam ORDER BY exam_date;
Резултатът изглежда така (редовете са сортирани във възходящ ред по exam_date
):
предмет | дата_изпит |
---|---|
Изкуство | NULL |
Математика | 19.12.2019 |
Наука | 2020-01-05 |
Здраве | 2020-01-05 |
английски | 08.01.2020 |
Дискусия:
Използвайте ORDER BY
ключова дума и името на колоната, по която искате да сортирате. По този начин ще сортирате данните във възходящ ред по тази колона. Можете също да използвате ASC
ключова дума, за да стане ясно, че поръчката е възходяща (най-ранната дата се показва първа, най-новата дата се показва последна и т.н.).
SELECT * FROM exam ORDER BY exam_date ASC;
Ако искате да видите най-новата дата първа и най-ранната дата последна, трябва да сортирате в низходящ ред. Използвайте DESC
ключова дума в този случай.
SELECT * FROM exam ORDER BY exam_date DESC;
Имайте предвид, че в MySQL NULL
s се показват първи при сортиране във възходящ ред и последни при сортиране в низходящ ред. Също така, редовете със същия exam_date
се показват в произволен ред (може да видите Science
трети и Health
четвърто, или Health
трети и Science
четвърто).
Пример 2:
exam
таблицата има следните колони:subject
, exam_year
, exam_month
и exam_day
. Месеците са дадени в имена, а не в числа.
предмет | изпитна_година | изпит_месец | изпитен_ден |
---|---|---|---|
Математика | 2019 | Декември | 19 |
английски | 2020 | Януари | 8 |
Наука | 2020 | Януари | 5 |
Здраве | 2020 | Януари | 5 |
Изкуство | NULL | NULL | NULL |
Искате да сортирате редовете по дата на изпита.
Решение:
SELECT * FROM exam ORDER BY STR_TO_DATE(CONCAT(exam_year, ' ', exam_month, ' ', exam_day), '%Y %M %d');
Резултатът изглежда така (редовете са сортирани във възходящ ред по exam_year
, exam_month
и exam_date
):
предмет | изпитна_година | изпит_месец | изпитен_ден |
---|---|---|---|
Изкуство | NULL | NULL | NULL |
Математика | 2019 | Декември | 19 |
Здраве | 2020 | Януари | 5 |
Наука | 2020 | Януари | 5 |
английски | 2020 | Януари | 8 |
Дискусия:
За да сортирате по дата, създайте стойности за дата от стойностите на годината, месеца и деня. За да направите това, използвайте функцията STR_TO_DATE(). Ако имате дата, съхранена като низ в 'Year Month Day
' формат, можете да го прехвърлите към дата, като използвате STR_TO_DATE(date_string, '%Y %M %d')
. Но първо трябва да създадете низ с помощта на функцията CONCAT():
CONCAT(exam_year, ' ', exam_month, ' ', exam_day)
CONCAT()
функцията комбинира всички аргументи в един низ. Не е нужно да прехвърляте числа към низове. Тъй като искате да получите низ в „Year Month Day
', аргументите са exam_year
, exam_month
, exam_day
и интервалите между тях.
След това трябва да преобразувате този низ в дата, като използвате STR_TO_DATE(date_string, '%Y %M %d')
функция. Вторият аргумент на тази функция е форматът на датата. %Y
означава година, %M
означава месец (пълното му име, а не число) и %d
означава ден.
STR_TO_DATE(CONCAT(exam_year, ' ', exam_month, ' ', exam_day), '%Y %M %d')
Използвайте го с ORDER BY
клауза за сортиране на редовете във възходящ ред по дата. Ако искате да видите редовете в низходящ ред, просто добавете DESC
ключова дума, като тази:
SELECT * FROM exam ORDER BY STR_TO_DATE(CONCAT(exam_year, ' ', exam_month, ' ', exam_day), '%Y %M %d') DESC;