2009-09-11 120 views
2

我正在寫一個SQL查詢以從兩個日期之間的表中檢索數據。我給出了兩個輸入,如圖所示。我轉換日期TO_CHAR(DD/MON/YYYY)Oracle日期格式 - 奇怪的行爲

1. StartDate > 01/SEP/2009 
    EndDate < 01/OCT/2009 

2. StartDate > 01/SEP/2009 
    EndDate < 1/OCT/2009 

我沒有得到任何結果的第一個輸入。當我將其更改爲第二個時,我會得到結果。 01/OCT/2009 & 1/OCT/2009和有什麼不一樣?

回答

3

當比較日期時,您應該始終將操作符的雙方明確轉換爲DATE數據類型。假設起始日期和結束日期均爲DATE數據類型,這會工作:

StartDate > to_date('01/SEP/2009', 'dd/MON/yyyy') 
AND EndDate < to_date('01/OCT/2009', 'dd/MON/yyyy') 

你的情況,但是你得到的結果是VARCHAR比較一致。你正在比較字符串,它是非常不可能的,你會得到正確的結果(因爲月份不按字母順序排序)。

如果起始日期和結束日期確實是VARCHAR,你應該明確地它們轉換:

to_date(StartDate, 'dd/MON/yyyy') > to_date('01/SEP/2009', 'dd/MON/yyyy') 
AND to_date(EndDate, 'dd/MON/yyyy') < to_date('01/OCT/2009', 'dd/MON/yyyy') 

這是有效的Oracle的所有版本。

0

由於我沒有可用於驗證我的答案的Oracle客戶端,所以不確定,但是:在Oracle中,表示日期(D)的日期字符串中的單個數字用於指定星期幾(星期一 - 星期日),而2位數字用於指定月份的日期(3位數字代表年份中的某一天)。雖然你提到你使用了正確的解釋方式來轉換字符串,但我認爲這可能是問題的根源(或者至少可以解釋不同之處)。