Problema:
Desea ordenar las filas por número de mes, dados los nombres de los meses (desea que enero se muestre primero, diciembre último).
Ejemplo:
El birthday la tabla contiene dos columnas:nombre y birthday_month . Los meses se dan en nombres, no en números.p>
| nombre | mes_cumpleaños |
|---|---|
| Ronan Tisha | NULO |
| Diciembre | 2020 |
| Angie Julia | abril |
| Narelle Dillan | abril |
| Purdie Casey | enero |
| Donna Nell | NULO |
| Blaze Graeme | octubre |
Desea ordenar las filas por birthday_month .
Solución:
SELECT *
FROM birthday
ORDER BY STR_TO_DATE(CONCAT('0001 ', birthday_month, ' 01'), '%Y %M %d');
El resultado se ve así:
| nombre | mes_cumpleaños |
|---|---|
| Donna Nell | NULO |
| Purdie Casey | enero |
| Angie Julia | abril |
| Narelle Dillan | abril |
| Blaze Graeme | octubre |
| Ronan Tisha | NULO |
| Diciembre | octubre |
Discusión:
Para ordenar por mes, cree una fecha con este mes. Para ello, utilice la función STR_TO_DATE(). Si tiene una fecha almacenada como una cadena en el 'Year Month Day ', puede convertirlo en una fecha usando STR_TO_DATE(date_string, '%Y %M %d') .
Primero, necesita crear una cadena usando la función CONCAT(). El año puede ser cualquier año que desee (por ejemplo, 0001 ) y el día puede ser cualquier día que desee (por ejemplo, 01 ):
CONCAT('0001 ', birthday_month, ' 01')
El CONCAT() La función combina todos los argumentos en una sola cadena. La cadena debe estar en 'Year Month Day ', por lo que el segundo argumento debe ser birthday_month; el primer y el tercer argumento solo necesitan estar en los formatos correctos.
Luego, debe convertir esta cadena en una fecha usando STR_TO_DATE(date_string, '%Y %M %d') función. El segundo argumento de esta función es el formato de la fecha. %Y significa año, %M significa mes (su nombre completo, no un número) y %d significa día.
STR_TO_DATE(CONCAT('0001 ', birthday_month, ' 01'), '%Y %M %d')
Úselo con un ORDER BY cláusula para ordenar las filas en orden ascendente por fecha. Si desea ver las filas en orden descendente, agregue un DESC palabra clave, como esta:
SELECT *
FROM birthday
ORDER BY STR_TO_DATE(CONCAT('0001 ', birthday_month, ' 01'), '%Y %M %d') DESC;
Tenga en cuenta que en MySQL, NULL Los correos electrónicos se muestran primero cuando se clasifican en orden ascendente y los últimos cuando se clasifican en orden descendente. Además, las filas con el mismo birthday_month se muestran en orden aleatorio (es posible que vea Angie Julia tercero y Narelle Dillan cuarto, o Narelle Dillan tercero y Angie Julia cuarto).