Oracle按日期排序会产生不同的结果

时间:2015-09-07 08:09:48

标签: sql oracle date-formatting

当testdate列的数据类型为DATE时,只是好奇以下两个查询为什么会给出不同的结果。

select testdate from <table> order by to_date(testdate) desc;

返回

18-DEC-14
17-DEC-14
14-JUL-14
10-JUL-14

select testdate from <table> order by testdate desc;

返回

13-NOV-13
18-DEC-14
17-DEC-14
14-JUL-14

为什么2013年11月的结果会出现在第二个结果的顶部,正如我所说的那样,TESTDATE是数据tyle DATE和to_date()解决了问题X?

2 个答案:

答案 0 :(得分:2)

根据OP通过评论回复,问题是:

SQL> WITH dates(dt) AS(
  2  SELECT to_date('18-DEC-2014', 'DD-MON-RR') FROM dual UNION ALL
  3  SELECT to_date('17-DEC-2014', 'DD-MON-RR') FROM dual UNION ALL
  4  SELECT to_date('14-JUL-2014', 'DD-MON-RR') FROM dual UNION ALL
  5  SELECT to_date('10-JUL-2014', 'DD-MON-RR') FROM dual UNION ALL
  6  SELECT to_date('13-NOV-3013', 'DD-MON-RR') FROM dual
  7  )
  8  SELECT dt yy_date,
  9    TO_CHAR(dt, 'DD-MON-YYYY') yyyy_date
 10  FROM dates
 11  ORDER BY dt DESC;

YY_DATE   YYYY_DATE
--------- -----------
13-NOV-13 13-NOV-3013
18-DEC-14 18-DEC-2014
17-DEC-14 17-DEC-2014
14-JUL-14 14-JUL-2014
10-JUL-14 10-JUL-2014

SQL>

由于哪一年3013显示为13以及其他日期2014,客户端将年份显示为 YY ,看起来好像2013年按降序排列于2014年之前。

使用 TO_CHAR 以所需格式显示日期,并使用 TO_DATE 将文字转换为日期。

旁注,

Never use TO_DATE on a DATE,它将隐式地将其转换为字符串,然后使用特定于语言环境的NLS格式返回日期。

答案 1 :(得分:1)

TO_DATE函数需要字符串将其转换为具有给定格式的日期。向to_date提供日期列可能会导致意外行为,即使oracle不会抱怨给定的输入。