Проблем:
Искате да сортирате редовете по номер на месец, като са дадени имена на месеци (искате януари да се показва първи, декември последен).
Пример:
birthday
таблицата съдържа две колони:име и birthday_month
. Месеците са дадени в имена, а не в числа.
name | рожден_месец |
---|---|
Ронан Тиша | NULL |
Декември | Януари |
Анджи Джулия | Април |
Нарел Дилън | Април |
Пърди Кейси | Януари |
Дона Нел | NULL |
Блейз Грейм | октомври |
Искате да сортирате редовете по birthday_month
.
Решение:
SELECT * FROM birthday ORDER BY EXTRACT(MONTH FROM TO_DATE(birthday_month, 'Month'));
Резултатът изглежда така (редовете са сортирани във възходящ ред по birthday_month
):
name | рожден_месец |
---|---|
Пърди Кейси | Януари |
Анджи Джулия | Април |
Нарел Дилън | Април |
Блейз Грейм | октомври |
Ронан Тиша | Януари |
Декември | NULL |
Дона Нел | NULL |
Дискусия:
За да сортирате редовете по месец, започвайки от януари и завършвайки с декември, трябва да преобразувате месеца в число ('January
' до 1, 'February
' до 2
и др.). В противен случай ще видите „December
' преди 'January
'. Функцията TO_DATE(birthday_month, 'Month') преобразува пълно име на месец в дата в '0001-MM-01
' формат. Например получавате „0001-12-01
' за декември.
Вече можете да използвате функцията EXTRACT(MONTH FROM date), за да извлечете месеца от тази стойност на датата. Месецът ще бъде число между 1
и 12
.
Комбинирайки тези две функции, можете да получите месеца като число, като използвате следната формула:
EXTRACT(MONTH FROM TO_DATE(birthday_month, 'Month'))
Поставете този израз след ORDER BY
за да сортирате редовете по месеци. Ако искате първо да видите последния месец, ще трябва да сортирате в низходящ ред. За да направите това, трябва да използвате DESC
ключова дума, като тази:
SELECT * FROM birthday ORDER BY EXTRACT(MONTH FROM TO_DATE(birthday_month, 'Month')) DESC;
Имайте предвид, че в PostgreSQL и Oracle NULL
s се показват последни при сортиране във възходящ ред и първи при сортиране в низходящ ред. Също така редовете със същия birthday_month
се показват в произволен ред (може да видите Angie Julia
второ и Narelle Dillan
трето, или Narelle Dillan
второ и Angie Julia
трето).