sql >> Base de Datos >  >> RDS >> Mysql

Cómo ordenar por nombre de mes en MySQL

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