In my application am trying to format and sort the date, i am using to_char()
function to format the date to my required format, but when i sort them it is sorting it as string sorting. But i want them to be sorted as date.
I need some help to achieve both in the same query. Kindly help me on the same.
The query which i used was,
SELECT to_char( t1.your_date_column1, your_format_mask ) as alias,
FROM your_table1 t1,your_table2
ORDER BY t1.your_date_column1
Oracle date format The standard date format for input and output is DD-MON-YY e.g., 01-JAN-17 which is controlled by the value of the NLS_DATE_FORMAT parameter. The following statement returns the current date with the standard date format by using the SYSDATE function.
You can use TO_CHAR in a query to display a DATE in any particular format, but, as you said, that makes the column a string, not a DATE. Usually, that doesn't matter. ALTER SESSION SET NLS_DATE_FORMAT = 'YYYY-MM-DD';SELECT hiredate, ...
Just use: select to_date(date_value, 'yyyy-mm-dd') as date_value from table; To convert to a date. That's it!
It sounds 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 your preferred format. In the ORDER BY
clause, you want to order by the actual date. Using the 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 add a DISTINCT, the problem is that Oracle doesn't know that the function you are applying (in this case TO_CHAR) provides a one-to-one mapping from the data in the table to the data in the output. For example, two different dates (October 1, 2010 10:15:15 and October 1, 2010 23:45:50) might generate the same character output, forcing Oracle to eliminate one of the two '01-10-2010' strings but the two dates would sort differently. You can rectify that problem by nesting your query and converting the string back to a date after doing the DISTINCT
and before doing the 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.
SELECT
to_char( your_date_column, your_format_mask ) as formate_purpose,
FROM your_table
ORDER BY to_date (formate_purpose)
Try the above code
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With