Sql Oracle order by date给出了不同的结果

Sql Oracle order by date给出了不同的结果,sql,oracle,date-formatting,Sql,Oracle,Date Formatting,奇怪的是,当testdate列的数据类型为DATE时,为什么下面两个查询会给出不同的结果 select testdate from <table> order by to_date(testdate) desc; 为什么2013年11月的结果会出现在第二个结果的顶部,而正如我所说的,coumn TESTDATE是data tyle DATE,而to_DATE()解析issueX?to_DATE函数希望字符串以给定格式将其转换为DATE。将日期列提供给“截止日期”可能会导致意外行为

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

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


为什么2013年11月的结果会出现在第二个结果的顶部,而正如我所说的,coumn TESTDATE是data tyle DATE,而to_DATE()解析issueX?

to_DATE函数希望字符串以给定格式将其转换为DATE。将日期列提供给“截止日期”可能会导致意外行为,即使oracle没有对给定的输入进行投诉。

根据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将文字转换为日期

另一方面


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

从order by testdate desc中选择什么作为字符(testdate,'yyyyy-mm-dd hh24:mi:ss')向您展示?这里有一个切题的教训,即当您不确定SQL返回特定结果的原因时,请始终查看实际数据。在本例中,请仔细查看to_date(testdate)verrrry的值,并思考它们为何按顺序排列。此外,如果
testdate
确实是一个日期,则:
to_date(testdate)
完全没有意义。这将把
date
转换为
varchar
,然后将
varchar
转换回开始时的
date
。它将隐式地将其转换为字符串,然后使用特定于语言环境的NLS格式返回到最新状态。@a_horse_与_no_name一起使用。记住,尽可能使用ANSI日期文字
日期“YYYY-MM-DD”
select testdate from <table> order by testdate desc;
13-NOV-13
18-DEC-14
17-DEC-14
14-JUL-14
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>