2016-08-02 54 views
0

我可以看到表中的數據與last_update_date02-AUG-16的Oracle SQL - 無法獲取數據

但是當我查詢:

select * from table_test where last_update_date = '02-AUG-16'

沒有行返回。

我在這裏做錯了什麼?

+0

該字段的數據類型是什麼? –

+0

檢查last_update_date列的日期格式。 – MMK

+0

它的日期類型.. –

回答

2

表格中的日期不都在午夜,但你的NLS_DATE_FORMAT設置不顯示的時間;而你正在做的隱式轉換恰恰是在尋找午夜。

如果你這樣做:

select to_char(last_update_date, 'YYYY-MM-DD HH24:MI:SS') 
from table_test 
where last_update_date >= date '2016-08-02' 
and last_update_date < date '2016-08-03' 

,你會看到每個值的時間部分。 where子句在指定的日期和午夜前第二天(儘管今天之後不太可能有)在午夜之後查找任何值。如果你只是做:

select to_char(last_update_date, 'YYYY-MM-DD HH24:MI:SS') 
from table_test 
where last_update_date = date '2016-08-02' 

或事實上,因爲你是隱式做:

where last_update_date = to_date('02-AUG-16', DD-MON-RR') 

你不會看到任何比賽,因爲沒有第一個查詢中找到的值的顯示時間爲00:00:00。

在查詢或顯示數據時,您不應該依賴會話的NLS_DATE_FORMAT設置。最好總是使用to_char()進行顯示 - 在最後可能的時刻 - 和to_date()進行比較,指定您需要的format modelusing ANSI date literals,正如我上面所做的那樣。 (你不應該回答其他NLS的問題;在這種情況下,你也假設你的NLS_DATE_LANGUAGE是英文,以匹配AUG)。

+0

嘿亞歷克斯..感謝您的詳細回答。你是真棒:) –

2

爲了避免任何的日期格式問題,請嘗試使用TO_DATE並指定格式:

select * 
from table_test 
where last_update_date = to_date('2016-08-02','yyyy-mm-dd'); 

如果還是不行,那麼忽略任何時候的問題(因爲默認情況下,上述匹配到2016- 08-02 12:00:00 @僅AM),你可以截斷日期問題:

select * 
from table_test 
where trunc(last_update_date) = to_date('2016-08-02','yyyy-mm-dd'); 
+1

'TRUNC(LAST_UPDATE_DATE)'防止在該列中的任何索引被使用(除非你有一個功能 - 截斷值的基於索引的索引)。它會工作,但效率會比它低。 –

+1

嗨詹姆斯,第二個查詢的實際工作..謝謝...... –

+0

@learningKid - 而第二個查詢不工作,請注意亞歷克斯·普爾的評論。 Gordon展示了一個「更長」的答案(更多打字),但他解釋了與Alex相同的東西 - 如果需要高效處理,最好不要使用「trunc()」(簡單的方法)。 – mathguy

2

我建議寫這篇爲:

select * 
from table_test 
where last_update_date >= date '2016-08-02' and 
     last_update_date < date '2016-08-03'; 

這假定last_update_date實際存儲爲一個日期。請注意,在Oracle中,date數據類型也可以包含一個時間組件,當您查看查詢中返回的值時,該組件可能不可見。

使用date關鍵字可以輸入ISO標準日期格式。

使用>=<允許Oracle在last_update_date(如果有)的情況下使用索引。

+0

謝謝戈登的幫助:) –