Проблем:
Искате да сортирате редовете по дата.
Пример 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;