2015-09-07 191 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日期格式。

相關問題