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