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