Oracle
 sql >> Database >  >> RDS >> Oracle

Come formattare e ordinare una data in Oracle?

Sembra che tu voglia qualcosa come

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

Nel SELECT list, si desidera restituire una stringa di caratteri che rappresenti la data nel formato preferito. Nel ORDER BY clausola, si desidera ordinare entro la data effettiva. Utilizzando lo standard EMP e DEPT tabelle, ad esempio

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.

Se aggiungi un DISTINCT, il problema è che Oracle non sa che la funzione che stai applicando (in questo caso TO_CHAR) fornisce una mappatura uno-a-uno dai dati nella tabella ai dati nell'output. Ad esempio, due date diverse (1 ottobre 2010 10:15:15 e 1 ottobre 2010 23:45:50) potrebbero generare lo stesso output di caratteri, costringendo Oracle a eliminare una delle due stringhe '01-10-2010' ma le due date sarebbero ordinate in modo diverso. Puoi correggere il problema annidando la tua query e riconvertendo la stringa in una data dopo aver eseguito il DISTINCT e prima di fare il 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.