Problém:
Chcete seřadit řádky podle čísla měsíce, daných názvů měsíců (chcete, aby se jako první zobrazoval leden, jako poslední prosinec).
Příklad:
birthday tabulka obsahuje dva sloupce:jméno a birthday_month . Měsíce jsou uvedeny ve jménech, nikoli v číslech.
| name | narozeniny_měsíc |
|---|---|
| Ronan Tisha | NULL |
| Prosinec | leden |
| Angie Julia | Duben |
| Narelle Dillanová | Duben |
| Purdie Casey | leden |
| Donna Nell | NULL |
| Blaze Graeme | Říjen |
Chcete seřadit řádky podle birthday_month .
Řešení:
SELECT * FROM birthday ORDER BY EXTRACT(MONTH FROM TO_DATE(birthday_month, 'Month'));
Výsledek vypadá takto (řádky jsou seřazeny vzestupně podle birthday_month ):
| name | narozeniny_měsíc |
|---|---|
| Purdie Casey | leden |
| Angie Julia | Duben |
| Narelle Dillanová | Duben |
| Blaze Graeme | Říjen |
| Ronan Tisha | leden |
| Prosinec | NULL |
| Donna Nell | NULL |
Diskuse:
Chcete-li seřadit řádky podle měsíce od ledna do prosince, musíte měsíc převést na číslo ('January ' až 1, 'February ' až 2 , atd.). V opačném případě byste viděli 'December ' před 'January '. Funkce TO_DATE(birthday_month, 'Month') převede celý název měsíce na datum v '0001-MM-01 ' formát. Například získáte '0001-12-01 “ za prosinec.
Nyní můžete pomocí funkce EXTRACT (MONTH FROM date) extrahovat měsíc z této hodnoty data. Měsíc bude číslo mezi 1 a 12 .
Kombinací těchto dvou funkcí můžete získat měsíc jako číslo pomocí následujícího vzorce:
EXTRACT(MONTH FROM TO_DATE(birthday_month, 'Month'))
Vložte tento výraz za ORDER BY seřadit řádky podle měsíce. Chcete-li jako první zobrazit poslední měsíc, budete je muset seřadit sestupně. Chcete-li to provést, musíte použít DESC klíčové slovo, například toto:
SELECT * FROM birthday ORDER BY EXTRACT(MONTH FROM TO_DATE(birthday_month, 'Month')) DESC;
Všimněte si, že v PostgreSQL a Oracle NULL s se zobrazují jako poslední při vzestupném řazení a jako první při sestupném řazení. Také řádky se stejným birthday_month se zobrazují v náhodném pořadí (můžete vidět Angie Julia druhý a Narelle Dillan třetí, nebo Narelle Dillan druhý a Angie Julia třetí).