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

¿Cómo formatear y ordenar una fecha en Oracle?

Parece que quieres algo como

SELECT to_char( your_date_column, your_format_mask )
  FROM your_table
 ORDER BY your_date_column

En el SELECT lista, desea devolver una cadena de caracteres que represente la fecha en su formato preferido. En el ORDER BY cláusula, desea ordenar por la fecha real. Usando el estándar EMP y DEPT tablas, por ejemplo

SQL> ed
Wrote file afiedt.buf

  1  select to_char( hiredate, 'DD-MM-YYYY' )
  2    from emp,
  3         dept
  4   where emp.deptno = dept.deptno
  5*  order by hiredate
SQL> /

TO_CHAR(HI
----------
17-12-1980
20-02-1981
22-02-1981
02-04-1981
01-05-1981
09-06-1981
08-09-1981
28-09-1981
17-11-1981
03-12-1981
03-12-1981
23-01-1982
19-04-1987
23-05-1987

14 rows selected.

Si agrega DISTINCT, el problema es que Oracle no sabe que la función que está aplicando (en este caso, TO_CHAR) proporciona una asignación uno a uno de los datos de la tabla a los datos de la salida. Por ejemplo, dos fechas diferentes (1 de octubre de 2010 10:15:15 y 1 de octubre de 2010 23:45:50) pueden generar la misma salida de caracteres, lo que obliga a Oracle a eliminar una de las dos cadenas '01-10-2010' pero las dos fechas se ordenarían de manera diferente. Puede corregir ese problema anidando su consulta y convirtiendo la cadena nuevamente a una fecha después de hacer DISTINCT y antes de hacer el ORDER BY

SQL> ed
Wrote file afiedt.buf

  1  select hire_date_str
  2    from (
  3      select distinct to_char( hiredate, 'DD-MM-YYYY' ) hire_date_str
  4        from emp,
  5             dept
  6       where emp.deptno = dept.deptno
  7      )
  8*  order by to_date(hire_date_str,'DD-MM-YYYY')
SQL> /

HIRE_DATE_
----------
17-12-1980
20-02-1981
22-02-1981
02-04-1981
01-05-1981
09-06-1981
08-09-1981
28-09-1981
17-11-1981
03-12-1981
23-01-1982
19-04-1987
23-05-1987

13 rows selected.