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