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

Cómo ordenar por fecha en PostgreSQL u Oracle

Problema:

Desea ordenar las filas por fecha.

Ejemplo 1:

El exam la tabla tiene dos columnas, subject y exam_date .

asunto fecha_examen
Matemáticas 2019-12-19
Inglés 2020-01-08
Ciencia 2020-01-05
Salud 2020-01-05
Arte NULO

Desea ordenar las filas por exam_date .

Solución:

SELECT *
FROM exam
ORDER BY exam_date;

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

asunto fecha_examen
Matemáticas 2019-12-19
Ciencia 2020-01-05
Salud 2020-01-05
Inglés 2020-01-08
Arte NULO

Discusión:

Usa el ORDER BY palabra clave y el nombre de la columna por la que desea ordenar. De esta forma, ordenará los datos en orden ascendente por esta columna. También podría usar el ASC palabra clave para dejar claro que el orden es ascendente (la fecha más antigua se muestra primero, la fecha más reciente se muestra en último lugar, etc.).

SELECT *
FROM exam
ORDER BY exam_date ASC;

Si desea ver la fecha más reciente primero y la fecha más antigua al final, debe ordenar en orden descendente. Usa el DESC palabra clave en este caso.

SELECT *
FROM exam
ORDER BY exam_date DESC;

Tenga en cuenta que en PostgreSQL y en 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 exam_date se muestran en orden aleatorio (es posible que vea Science segundo y Health tercero, o Salud segundo y Science tercero).

Ejemplo 2:

El exam la tabla tiene las siguientes columnas:subject , exam_year , exam_month y exam_day . Los meses se dan en nombres, no en números.

asunto examen_año examen_mes dia_examen
Matemáticas 2019 diciembre 19
Inglés 2020 enero 8
Ciencia 2020 enero 5
Salud 2020 enero 5
Arte NULO NULO NULO

Desea ordenar las filas por fecha de examen.

Solución:

SELECT *
FROM exam
ORDER BY
  exam_year,
  EXTRACT(MONTH FROM TO_DATE(exam_month, 'Month')),
  exam_day;

El resultado se ve así (las filas están ordenadas en orden ascendente por exam_year , exam_month y exam_date ):

asunto examen_año examen_mes dia_examen
Matemáticas 2019 diciembre 19
Salud 2020 enero 5
Ciencia 2020 enero 5
Inglés 2020 enero 8
Arte NULO NULO NULO

Discusión:

Debe ordenar las filas por tres valores:el año, el mes y el día, pero para tener el orden correcto, 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(exam_month, 'Month') convierte el nombre completo del mes 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 se devolverá como un número.

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

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

Para ordenar las filas por fecha, debe ordenar por año, mes y día (en este orden). Si desea ver primero el examen más reciente, deberá ordenar en orden descendente. Para hacer esto, necesita usar un DESC palabra clave después de cada columna en ORDER BY cláusula.

SELECT *
FROM exam
ORDER BY
  exam_year DESC,
  EXTRACT(MONTH FROM TO_DATE(exam_month, 'Month')) DESC,
  exam_day DESC;