Problem:
Du vil sortere rækkerne efter månedsnummer, givet månedsnavne (du ønsker, at januar skal vises først, december sidste).
Eksempel:
birthday tabel indeholder to kolonner:navn og birthday_month . Månederne er angivet i navne, ikke i tal.p>
| navn | fødselsdag_måned |
|---|---|
| Ronan Tisha | NULL |
| December | 2020 |
| Angie Julia | April |
| Narelle Dillan | April |
| Purdie Casey | Januar |
| Donna Nell | NULL |
| Blaze Graeme | Oktober |
Du vil sortere rækkerne efter birthday_month .
Løsning:
SELECT *
FROM birthday
ORDER BY STR_TO_DATE(CONCAT('0001 ', birthday_month, ' 01'), '%Y %M %d');
Resultatet ser således ud:
| navn | fødselsdag_måned |
|---|---|
| Donna Nell | NULL |
| Purdie Casey | Januar |
| Angie Julia | April |
| Narelle Dillan | April |
| Blaze Graeme | Oktober |
| Ronan Tisha | NULL |
| December | Oktober |
Diskussion:
For at bestille efter måned skal du oprette en dato med denne måned. For at gøre dette skal du bruge STR_TO_DATE()-funktionen. Hvis du har en dato gemt som en streng i 'Year Month Day ' format, kan du caste det til en dato ved hjælp af STR_TO_DATE(date_string, '%Y %M %d') .
Først skal du oprette en streng ved hjælp af CONCAT()-funktionen. Året kan være et hvilket som helst år, du ønsker (f.eks. 0001 ), og dagen kan være hvilken som helst dag, du ønsker (f.eks. 01 ):
CONCAT('0001 ', birthday_month, ' 01')
CONCAT() funktion kombinerer alle argumenterne i én streng. Strengen skal være i 'Year Month Day ' format, så det andet argument skal være birthday_month; det første og det tredje argument skal blot være i de rigtige formater.
Derefter skal du konvertere denne streng til en dato ved hjælp af STR_TO_DATE(date_string, '%Y %M %d') fungere. Det andet argument for denne funktion er formatet på datoen. %Y står for år, %M står for måned (dets fulde navn, ikke et tal), og %d står for dag.
STR_TO_DATE(CONCAT('0001 ', birthday_month, ' 01'), '%Y %M %d')
Brug den med en ORDER BY klausul for at sortere rækkerne i stigende rækkefølge efter dato. Hvis du gerne vil se rækkerne i faldende rækkefølge, skal du blot tilføje en DESC søgeord som dette:
SELECT *
FROM birthday
ORDER BY STR_TO_DATE(CONCAT('0001 ', birthday_month, ' 01'), '%Y %M %d') DESC;
Bemærk, at i MySQL, NULL s vises først ved sortering i stigende rækkefølge og sidst ved sortering i faldende rækkefølge. Også rækkerne med den samme birthday_month vises i tilfældig rækkefølge (du kan muligvis se Angie Julia tredje og Narelle Dillan fjerde, eller Narelle Dillan tredje og Angie Julia fjerde).