当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?
答案 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不会抱怨给定的输入。