Mysql
 sql >> Database >  >> RDS >> Mysql

Come ordinare per nome del mese in MySQL

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