Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Wie formatiere und sortiere ich ein Datum in Oracle?

Es hört sich so an, als wollten Sie so etwas wie

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

Im SELECT list möchten Sie eine Zeichenfolge zurückgeben, die das Datum in Ihrem bevorzugten Format darstellt. Im Feld ORDER BY Klausel, möchten Sie bis zum tatsächlichen Datum bestellen. Verwenden des Standard-EMP und DEPT Tabellen, zum Beispiel

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.

Wenn Sie ein DISTINCT hinzufügen, besteht das Problem darin, dass Oracle nicht weiß, dass die Funktion, die Sie anwenden (in diesem Fall TO_CHAR), eine Eins-zu-Eins-Zuordnung von den Daten in der Tabelle zu den Daten in der Ausgabe bereitstellt. Beispielsweise könnten zwei unterschiedliche Daten (1. Oktober 2010 10:15:15 und 1. Oktober 2010 23:45:50) dieselbe Zeichenausgabe erzeugen, was Oracle dazu zwingt, eine der beiden Zeichenfolgen „01-10-2010“ zu eliminieren aber die beiden Daten würden anders sortiert werden. Sie können dieses Problem beheben, indem Sie Ihre Abfrage verschachteln und die Zeichenfolge zurück in ein Datum konvertieren, nachdem Sie DISTINCT ausgeführt haben und bevor Sie ORDER BY ausführen

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.