Problem:
Du vill sortera raderna efter månadsnummer, givna månadsnamn (du vill att januari ska visas först, december sista).
Exempel:
birthday Tabellen innehåller två kolumner:namn och birthday_month . Månaderna anges i namn, inte i siffror.p>
| namn | födelsedag_månad |
|---|---|
| Ronan Tisha | NULL |
| December | 2020 |
| Angie Julia | April |
| Narelle Dillan | April |
| Purdie Casey | Januari |
| Donna Nell | NULL |
| Blaze Graeme | Oktober |
Du vill sortera raderna efter birthday_month .
Lösning:
SELECT *
FROM birthday
ORDER BY STR_TO_DATE(CONCAT('0001 ', birthday_month, ' 01'), '%Y %M %d');
Resultatet ser ut så här:
| namn | födelsedag_månad |
|---|---|
| Donna Nell | NULL |
| Purdie Casey | Januari |
| Angie Julia | April |
| Narelle Dillan | April |
| Blaze Graeme | Oktober |
| Ronan Tisha | NULL |
| December | Oktober |
Diskussion:
För att beställa per månad, skapa ett datum med denna månad. För att göra detta, använd STR_TO_DATE()-funktionen. Om du har ett datum lagrat som en sträng i 'Year Month Day ' format, kan du casta det till ett datum med STR_TO_DATE(date_string, '%Y %M %d') .
Först måste du skapa en sträng med CONCAT()-funktionen. Året kan vara vilket år du vill (t.ex. 0001 ) och dagen kan vara vilken dag du vill (t.ex. 01 ):
CONCAT('0001 ', birthday_month, ' 01')
CONCAT() funktion kombinerar alla argument till en sträng. Strängen ska finnas i 'Year Month Day ' format, så det andra argumentet bör vara birthday_month; det första och det tredje argumentet behöver bara vara i rätt format.
Sedan måste du konvertera denna sträng till ett datum med STR_TO_DATE(date_string, '%Y %M %d') fungera. Det andra argumentet för denna funktion är formatet på datumet. %Y står för år, %M står för månad (dess fullständiga namn, inte ett nummer), och %d står för dag.
STR_TO_DATE(CONCAT('0001 ', birthday_month, ' 01'), '%Y %M %d')
Använd den med en ORDER BY sats för att sortera raderna i stigande ordning efter datum. Om du vill se raderna i fallande ordning, lägg bara till en DESC nyckelord, så här:
SELECT *
FROM birthday
ORDER BY STR_TO_DATE(CONCAT('0001 ', birthday_month, ' 01'), '%Y %M %d') DESC;
Observera att i MySQL, NULL s visas först vid sortering i stigande ordning och sist vid sortering i fallande ordning. Dessutom raderna med samma birthday_month visas i slumpmässig ordning (du kan se Angie Julia tredje och Narelle Dillan fjärde, eller Narelle Dillan tredje och Angie Julia fjärde).