Проблем:
Искате да сортирате редовете по дата.
Пример 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 ):
| предмет | дата_изпит |
|---|---|
| Математика | 19.12.2019 |
| Наука | 2020-01-05 |
| Здраве | 2020-01-05 |
| английски | 08.01.2020 |
| Изкуство | NULL |
Дискусия:
Използвайте ORDER BY ключова дума и името на колоната, по която искате да сортирате. По този начин ще сортирате данните във възходящ ред по тази колона. Можете също да използвате ASC ключова дума, за да стане ясно, че поръчката е възходяща (най-ранната дата се показва първа, най-новата дата се показва последна и т.н.).
SELECT * FROM exam ORDER BY exam_date ASC;
Ако искате да видите най-новата дата първа и най-ранната дата последна, трябва да сортирате в низходящ ред. Използвайте DESC ключова дума в този случай.
SELECT * FROM exam ORDER BY exam_date DESC;
Имайте предвид, че в PostgreSQL и в Oracle NULL s се показват последни при сортиране във възходящ ред и първи при сортиране в низходящ ред. Също така, редовете със същия exam_date се показват в произволен ред (може да видите Science второ и 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 exam_year, EXTRACT(MONTH FROM TO_DATE(exam_month, 'Month')), exam_day;
Резултатът изглежда така (редовете са сортирани във възходящ ред по exam_year , exam_month и exam_date ):
| предмет | изпитна_година | изпит_месец | изпитен_ден |
|---|---|---|---|
| Математика | 2019 | Декември | 19 |
| Здраве | 2020 | Януари | 5 |
| Наука | 2020 | Януари | 5 |
| английски | 2020 | Януари | 8 |
| Изкуство | NULL | NULL | NULL |
Дискусия:
Трябва да подредите редовете по три стойности:година, месец и ден, но за да имате правилния ред, трябва да преобразувате месеца в число ('January ' до 1 , 'February ' до 2 и др.). В противен случай ще видите „December ' преди 'January '. Функцията TO_DATE(exam_month, 'Month') преобразува пълното име на месеца в дата в '0001-MM-01 ' формат. Например получавате „0001-12-01 ' за декември.
Вече можете да използвате функцията EXTRACT(MONTH FROM date), за да извлечете месеца от тази стойност на датата. Месецът ще бъде върнат като число.
Комбинирайки тези две функции, можете да получите месеца като число, като използвате следната формула:
EXTRACT(MONTH FROM TO_DATE(exam_month, 'Month'))
За да сортирате редовете по дата, трябва да сортирате по година, месец и ден (в този ред). Ако искате първо да видите последния изпит, ще трябва да сортирате в низходящ ред. За да направите това, трябва да използвате DESC ключова дума след всяка колона в ORDER BY клауза.
SELECT * FROM exam ORDER BY exam_year DESC, EXTRACT(MONTH FROM TO_DATE(exam_month, 'Month')) DESC, exam_day DESC;