sql >> Base de Datos >  >> RDS >> Oracle

Cómo ordenar por nombre de mes en PostgreSQL u Oracle

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.

nombre mes_cumpleaños
Ronan Tisha NULO
Diciembre enero
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 EXTRACT(MONTH FROM TO_DATE(birthday_month, 'Month'));

El resultado se ve así (las filas están ordenadas en orden ascendente por birthday_month ):

nombre mes_cumpleaños
Purdie Casey enero
Angie Julia abril
Narelle Dillan abril
Blaze Graeme octubre
Ronan Tisha enero
Diciembre NULO
Donna Nell NULO

Discusión:

Para ordenar las filas por mes a partir de enero y terminando en diciembre, debe convertir el mes en un número ('January ' a 1, 'February ' a 2 , etc.). De lo contrario, vería 'December ' antes de 'January '. La función TO_DATE(birthday_month, 'Month') convierte el nombre de un mes completo en una fecha en el '0001-MM-01 ' formato. Por ejemplo, obtienes '0001-12-01 ' para diciembre.

Ahora puede usar la función EXTRACTO (MES DESDE la fecha) para extraer el mes de este valor de fecha. El mes será un número entre 1 y 12 .

Combinando estas dos funciones, puedes obtener el mes como un número usando la siguiente fórmula:

EXTRACT(MONTH FROM TO_DATE(birthday_month, 'Month'))

Pon esta expresión después de ORDER BY para ordenar las filas por mes. Si desea ver primero el último mes, deberá ordenar en orden descendente. Para hacer esto, necesitas usar un DESC palabra clave, como esta:

SELECT *
FROM birthday
ORDER BY EXTRACT(MONTH FROM TO_DATE(birthday_month, 'Month')) DESC;

Tenga en cuenta que en PostgreSQL y Oracle, NULL Los correos electrónicos se muestran en último lugar cuando se clasifican en orden ascendente y en primer lugar 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 segundo y Narelle Dillan tercero, o Narelle Dillan segundo y Angie Julia tercero).