2015-09-07 524 views
1

只有当testdate列的数据类型为DATE时,才好奇为什么以下两个查询会给出不同的结果。Oracle按日期排序会给出不同的结果

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月的结果显示在第二个结果的顶部时,按我说的coumn TESTDATE是数据tyle DATE和TO_DATE(的)解决了issueX?

+5

什么'select to_char(testdate,'yyyy-mm-dd hh24:mi:ss')from

order by testdate desc;'show you? –

+1

这里有一个切题的教训,那就是当你不确定为什么SQL返回一个特定的结果时,总是看看实际的数据。在这种情况下,仔细查看to_date(testdate)verrrrry的值,并考虑他们为什么按照他们的方式排序。 –

+2

另外:'test_date(testdate)'是完全没有意义的,如果'testdate' **真**是一个日期。这会将'date'转换为'varchar',然后将'varchar'转换回它的开始日期。 –

回答

1

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

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> 

钍客户端显示一年YY由于这一年3013显示为13,并连同其他日期2014,它看起来就好像2013年在2014年之前按降序排列。

使用TO_CHAR,以显示你想要的格式的日期,并使用TO_DATE到文字转换成日期。

在一个侧面说明,

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