Oracle
 sql >> Base de données >  >> RDS >> Oracle

Comment formater et trier une date dans Oracle ?

On dirait que vous voulez quelque chose comme

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

Dans le SELECT list, vous souhaitez renvoyer une chaîne de caractères qui représente la date dans votre format préféré. Dans le ORDER BY clause, vous souhaitez commander à la date réelle. Utilisation de la norme EMP et DEPT tableaux, par exemple

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 vous ajoutez un DISTINCT, le problème est qu'Oracle ne sait pas que la fonction que vous appliquez (dans ce cas TO_CHAR) fournit un mappage un à un des données de la table aux données de la sortie. Par exemple, deux dates différentes (1er octobre 2010 10:15:15 et 1er octobre 2010 23:45:50) peuvent générer la même sortie de caractères, forçant Oracle à éliminer l'une des deux chaînes '01-10-2010' mais les deux dates seraient triées différemment. Vous pouvez corriger ce problème en imbriquant votre requête et en reconvertissant la chaîne en une date après avoir fait le DISTINCT et avant de faire le 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.