Probleem:
U wilt de rijen sorteren op maandnummer, gegeven maandnamen (u wilt dat januari eerst wordt weergegeven, december laatst).
Voorbeeld:
De birthday tabel bevat twee kolommen:naam en birthday_month . De maanden worden gegeven in namen, niet in cijfers.p>
| naam | verjaardag_maand |
|---|---|
| Ronan Tisha | NULL |
| December | 2020 |
| Angie Julia | April |
| Narelle Dillan | April |
| Purdie Casey | Januari |
| Donna Nell | NULL |
| Blaze Graeme | Oktober |
U wilt de rijen sorteren op birthday_month .
Oplossing:
SELECT *
FROM birthday
ORDER BY STR_TO_DATE(CONCAT('0001 ', birthday_month, ' 01'), '%Y %M %d');
Het resultaat ziet er als volgt uit:
| naam | verjaardag_maand |
|---|---|
| Donna Nell | NULL |
| Purdie Casey | Januari |
| Angie Julia | April |
| Narelle Dillan | April |
| Blaze Graeme | Oktober |
| Ronan Tisha | NULL |
| December | Oktober |
Discussie:
Om per maand te bestellen, maak je een datum aan met deze maand. Gebruik hiervoor de functie STR_TO_DATE(). Als u een datum hebt opgeslagen als een tekenreeks in de 'Year Month Day ' formaat, kunt u het naar een datum casten met STR_TO_DATE(date_string, '%Y %M %d') .
Eerst moet je een string maken met de functie CONCAT(). Het jaar kan elk jaar zijn dat u wilt (bijv. 0001 ) en de dag kan elke gewenste dag zijn (bijv. 01 ):
CONCAT('0001 ', birthday_month, ' 01')
De CONCAT() functie combineert alle argumenten in één string. De tekenreeks moet in de 'Year Month Day . staan ' formaat, dus het tweede argument moet birthday_month . zijn; het eerste en het derde argument moeten alleen in de juiste indeling zijn.
Vervolgens moet u deze tekenreeks converteren naar een datum met behulp van de STR_TO_DATE(date_string, '%Y %M %d') functie. Het tweede argument van deze functie is het formaat van de datum. %Y staat voor jaar, %M staat voor maand (de volledige naam, geen nummer), en %d staat voor dag.
STR_TO_DATE(CONCAT('0001 ', birthday_month, ' 01'), '%Y %M %d')
Gebruik het met een ORDER BY om de rijen in oplopende volgorde op datum te sorteren. Als u de rijen in aflopende volgorde wilt zien, voegt u gewoon een DESC . toe zoekwoord, zoals dit:
SELECT *
FROM birthday
ORDER BY STR_TO_DATE(CONCAT('0001 ', birthday_month, ' 01'), '%Y %M %d') DESC;
Merk op dat in MySQL, NULL s worden als eerste weergegeven bij het sorteren in oplopende volgorde en als laatste bij het sorteren in aflopende volgorde. Ook de rijen met dezelfde birthday_month worden in willekeurige volgorde weergegeven (je ziet mogelijk Angie Julia derde en Narelle Dillan vierde, of Narelle Dillan derde en Angie Julia vierde).