It looks like you want something like
SELECT to_char( your_date_column, your_format_mask ) FROM your_table ORDER BY your_date_column
In the SELECT list, you want to return a character string that represents the date in the preferred format. In the ORDER BY you want to order the actual date. Using standard EMP and DEPT tables, for example
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.
If you added DISTINCT, the problem is that Oracle does not know that the function you are using (in this case TO_CHAR) provides a one-to-one comparison of the data in the table with the output data, for example, two different dates (October 1, 2010 10:15 : October 15 and October 1, 2010 11:45:50 PM) can generate the same character output, forcing Oracle to exclude one of the two lines "101-10-2010" but the two dates will be sorted differently. You can fix this problem by nesting your query and converting the string back to a date after executing DISTINCT and before executing 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.
source share