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í).