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.p>
name | narozeniny_měsíc |
---|---|
Ronan Tisha | NULL |
Prosinec | 2020 |
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 STR_TO_DATE(CONCAT('0001 ', birthday_month, ' 01'), '%Y %M %d');
Výsledek vypadá takto:
name | narozeniny_měsíc |
---|---|
Donna Nell | NULL |
Purdie Casey | leden |
Angie Julia | Duben |
Narelle Dillanová | Duben |
Blaze Graeme | Říjen |
Ronan Tisha | NULL |
Prosinec | Říjen |
Diskuse:
Chcete-li objednat podle měsíce, vytvořte datum s tímto měsícem. Chcete-li to provést, použijte funkci STR_TO_DATE(). Pokud máte datum uložené jako řetězec v 'Year Month Day
', můžete jej přenést na datum pomocí STR_TO_DATE(date_string, '%Y %M %d')
.
Nejprve musíte vytvořit řetězec pomocí funkce CONCAT(). Rok může být libovolný rok (např. 0001
) a den může být libovolný den (např. 01
):
CONCAT('0001 ', birthday_month, ' 01')
CONCAT()
funkce kombinuje všechny argumenty do jednoho řetězce. Řetězec by měl být v 'Year Month Day
', takže druhý argument by měl být birthday_month
; první a třetí argument musí být pouze ve správném formátu.
Poté musíte tento řetězec převést na datum pomocí STR_TO_DATE(date_string, '%Y %M %d')
funkce. Druhým argumentem této funkce je formát data. %Y
znamená rok, %M
znamená měsíc (jeho celé jméno, nikoli číslo) a %d
znamená den.
STR_TO_DATE(CONCAT('0001 ', birthday_month, ' 01'), '%Y %M %d')
Použijte jej s ORDER BY
klauzule k řazení řádků vzestupně podle data. Pokud chcete řádky zobrazit v sestupném pořadí, stačí připojit DESC
klíčové slovo, například toto:
SELECT * FROM birthday ORDER BY STR_TO_DATE(CONCAT('0001 ', birthday_month, ' 01'), '%Y %M %d') DESC;
Všimněte si, že v MySQL NULL
s se zobrazují jako první při vzestupném řazení a jako poslední 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
třetí a Narelle Dillan
čtvrtý, nebo Narelle Dillan
třetí a Angie Julia
čtvrtý).