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