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