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