如何在Oracle中格式化和排序日期?

时间:2011-08-17 13:33:31

标签: oracle

在我的应用程序中我试图对日期进行格式化和排序,我使用to_char()函数将日期格式化为我所需的格式,但是当我对它们进行排序时,它将它排序为字符串排序。但我希望它们按日期排序。

我需要一些帮助才能在同一个查询中实现这两个目标。请帮助我。

我使用的查询是,

SELECT to_char( t1.your_date_column1, your_format_mask ) as alias,
  FROM your_table1 t1,your_table2
 ORDER BY t1.your_date_column1

7 个答案:

答案 0 :(得分:15)

听起来你想要像

这样的东西
SELECT to_char( your_date_column, your_format_mask )
  FROM your_table
 ORDER BY your_date_column

SELECT列表中,您希望返回以首选格式表示日期的字符串。在ORDER BY子句中,您希望按实际日期排序。使用标准EMPDEPT表,例如

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.

如果添加DISTINCT,问题是Oracle不知道您正在应用的函数(在本例中为TO_CHAR)提供从表中的数据到输出中的数据的一对一映射。例如,两个不同的日期(2010年10月1日10:15:15和2010年10月1日23:45:50)可能会生成相同的字符输出,迫使Oracle消除两个'01 -10-2010'字符串中的一个但这两个日期的排序方式不同。您可以通过嵌套查询并在执行DISTINCT之后和执行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.

答案 1 :(得分:3)

SELECT 
         to_char( your_date_column, your_format_mask ) as formate_purpose,

FROM your_table

ORDER BY to_date (formate_purpose)

试试上面的代码

答案 2 :(得分:2)

最简单的方法是再次使用查询检索相同的字段,并根据该字段进行排序

在你的例子中

SELECT 
         to_char( your_date_column, your_format_mask ) as formate_purpose,
         your_date_column as sorting_purpose
FROM your_table

ORDER BY your_date_column

答案 3 :(得分:1)

您没有说明您的应用程序是什么写入的,但在某些环境中(例如Oracle APEX,Oracle Reports),解决方案是在查询中使用to_char,但是然后在工具的“列属性”或类似属性中应用所需的格式。

答案 4 :(得分:0)

如果你让Oracle排序(推荐),就像Justin Cave的答案中描述的那样。如果由于某种原因,您在Java中进行排序,请不要使用to_char;将日期改为Date个对象并使用例如一个SimpleDateFormat用于在Java中进行格式化(排序后)。

答案 5 :(得分:0)

对于sqlplus,使用alter session set nls_date_format到你想要的日期格式,然后在select语句和排序顺序中使用列名。

答案 6 :(得分:-1)

我想按日期字段分组依次排序,但日期字段包含时间,我不想在分组和排序中包含时间。所以我将Date转换为Character,然后将字符转换回Date以消除Time并按日期排序而不是按文本排序。它按日期对数据进行分组,并按日期排序。

-- Projects initiated by Day.
select to_date(to_char(psd.PROJECTSTATUSDATE, 'mm/dd/yyyy'),'mm/dd/yyyy') as "Date", count(*)
from project pj, project_status_date psd
where PJ.PROJECTTOKEN = PSD.PROJECTTOKEN
      and psd.PROJECTSTATUSDATE > '01-JAN-2001'
      and PSD.PROJECTSTATUSCODE = 'BL'
group by to_date(to_char(psd.PROJECTSTATUSDATE, 'mm/dd/yyyy'),'mm/dd/yyyy') 
order by to_date(to_char(psd.PROJECTSTATUSDATE, 'mm/dd/yyyy'),'mm/dd/yyyy') 

Date      Count
8/16/2013   102
8/19/2013   77
8/20/2013   257
8/21/2013   30
8/22/2013   173
8/23/2013   125
8/26/2013   41
8/27/2013   25
8/28/2013   14