我可以看到表中的數據與last_update_date
爲02-AUG-16
的Oracle SQL - 無法獲取數據
但是當我查詢:
select * from table_test where last_update_date = '02-AUG-16'
沒有行返回。
我在這裏做錯了什麼?
我可以看到表中的數據與last_update_date
爲02-AUG-16
的Oracle SQL - 無法獲取數據
但是當我查詢:
select * from table_test where last_update_date = '02-AUG-16'
沒有行返回。
我在這裏做錯了什麼?
表格中的日期不都在午夜,但你的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 model或using ANSI date literals,正如我上面所做的那樣。 (你不應該回答其他NLS的問題;在這種情況下,你也假設你的NLS_DATE_LANGUAGE是英文,以匹配AUG
)。
嘿亞歷克斯..感謝您的詳細回答。你是真棒:) –
爲了避免任何的日期格式問題,請嘗試使用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');
'TRUNC(LAST_UPDATE_DATE)'防止在該列中的任何索引被使用(除非你有一個功能 - 截斷值的基於索引的索引)。它會工作,但效率會比它低。 –
嗨詹姆斯,第二個查詢的實際工作..謝謝...... –
@learningKid - 而第二個查詢不工作,請注意亞歷克斯·普爾的評論。 Gordon展示了一個「更長」的答案(更多打字),但他解釋了與Alex相同的東西 - 如果需要高效處理,最好不要使用「trunc()」(簡單的方法)。 – mathguy
我建議寫這篇爲:
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
(如果有)的情況下使用索引。
謝謝戈登的幫助:) –
該字段的數據類型是什麼? –
檢查last_update_date列的日期格式。 – MMK
它的日期類型.. –