Problema:
Vuoi ordinare le righe in base al numero del mese, dati i nomi dei mesi (vuoi che gennaio venga mostrato per primo, dicembre per ultimo).
Esempio:
Il birthday
la tabella contiene due colonne:nome e birthday_month
. I mesi sono indicati in nomi, non in numeri.p>
name | mese_compleanno |
---|---|
Ronan Tisha | NULLO |
Dicembre | 2020 |
Angie Julia | Aprile |
Narelle Dillan | Aprile |
Purdie Casey | gennaio |
Donna Nell | NULLO |
Blaze Graeme | ottobre |
Vuoi ordinare le righe per birthday_month
.
Soluzione:
SELECT * FROM birthday ORDER BY STR_TO_DATE(CONCAT('0001 ', birthday_month, ' 01'), '%Y %M %d');
Il risultato è simile al seguente:
nome | mese_compleanno |
---|---|
Donna Nell | NULLO |
Purdie Casey | gennaio |
Angie Julia | Aprile |
Narelle Dillan | Aprile |
Blaze Graeme | ottobre |
Ronan Tisha | NULLO |
Dicembre | ottobre |
Discussione:
Per ordinare per mese, crea una data con questo mese. A tale scopo, utilizzare la funzione STR_TO_DATE(). Se hai una data memorizzata come stringa nel 'Year Month Day
' format, puoi trasmetterlo a una data usando STR_TO_DATE(date_string, '%Y %M %d')
.
Innanzitutto, è necessario creare una stringa utilizzando la funzione CONCAT(). L'anno può essere qualsiasi anno desiderato (ad es. 0001
) e il giorno può essere qualsiasi giorno desiderato (ad es. 01
):
CONCAT('0001 ', birthday_month, ' 01')
Il CONCAT()
La funzione combina tutti gli argomenti in una stringa. La stringa deve essere nel 'Year Month Day
', quindi il secondo argomento dovrebbe essere birthday_month
; il primo e il terzo argomento devono solo essere nel formato corretto.
Quindi, devi convertire questa stringa in una data utilizzando STR_TO_DATE(date_string, '%Y %M %d')
funzione. Il secondo argomento di questa funzione è il formato della data. %Y
sta per anno, %M
sta per mese (il suo nome completo, non un numero) e %d
sta per giorno.
STR_TO_DATE(CONCAT('0001 ', birthday_month, ' 01'), '%Y %M %d')
Usalo con un ORDER BY
clausola per ordinare le righe in ordine crescente per data. Se desideri visualizzare le righe in ordine decrescente, aggiungi semplicemente un DESC
parola chiave, come questa:
SELECT * FROM birthday ORDER BY STR_TO_DATE(CONCAT('0001 ', birthday_month, ' 01'), '%Y %M %d') DESC;
Nota che in MySQL, NULL
I messaggi vengono visualizzati per primi quando si ordina in ordine crescente e per ultimi quando si ordina in ordine decrescente. Inoltre, le righe con lo stesso birthday_month
vengono visualizzati in ordine casuale (potresti vedere Angie Julia
terzo e Narelle Dillan
quarto, o Narelle Dillan
terzo e Angie Julia
quarto).