2015-07-22 83 views
0

我從表中獲取某些日期範圍的數據,但查詢沒有獲取當天日期的數據。請任何人都可以幫我解釋爲什麼發生這種情況查詢沒有得到當前日期結果

select * 
from mytable 
where action_date >= to_date('01/07/2015', 'DD/MM/YYYY') 
and action_date <= to_date('22/07/2015', 'DD/MM/YYYY'); 

結果未顯示22/07/2015數據。

編輯:在該列

ACTION_DATE TIMESTAMP(6) 

採樣日期:

22/07/15 12:47:18.000000000 PM

+0

「action_date」的數據類型是什麼? –

+0

te列的數據類型是什麼?它包括時間戳嗎?請提供樣品數據。 – Jens

+0

22/07/2015將22/07/2015 00:00:00我猜 – Chaka

回答

0

我已經通過這種方式改變了查詢,其工作按預期。

SELECT * 
FROM mytable 
WHERE action_date             >= to_date('01/07/2015', 'DD/MM/YYYY') 
AND TRUNC(to_date(TO_CHAR(action_date, 'DD/MM/YYYY'), 'DD/MM/YYYY')) <= TRUNC(to_date('22/07/2015', 'DD/MM/YYYY')); 
0

那是因爲你正在轉換to_date的日期,這會導致2015年2月22日00:00:00,並且您2015年7月22日的action_date時間會附加一段時間。你需要在日期中轉換action_date。

select * from mytable where cast(action_date >= to_date('01/07/2015', 'DD/MM/YYYY') and cast(action_date as date) <= to_date('22/07/2015', 'DD/MM/YYYY'); 
2

嘗試添加部分時間:

select * 
from mytable 
where action_date >= to_date('01/07/2015 00:00:00,000000000', 'DD/MM/YYYY HH24:MI:SS,FF9') 
and action_date <= to_date('22/07/2015 23:59:00,999999999', 'DD/MM/YYYY HH24:MI:SS,FF9'); 

如果你只給了日期部分,時間部分被自動與實際時間增加,因此,如果在部分時間晚你不得到這一行。

+0

希望你明白,沒有個人對此。因爲我的回答是iam期待的,但是我提出了你的回答,因爲你解釋了爲什麼那樣表現的原因。 – developer

-1

最簡單的解決方案是使用'< nextday'而不是'< = 23:59:59'。

select * from mytable 
where action_date >= to_date('01/07/2015', 'DD/MM/YYYY')  
and action_date < to_date('23/07/2015', 'DD/MM/YYYY'); 
+0

我不認爲如果ACTION_DATE有一個索引,那麼使用less會阻止優化器選擇索引範圍掃描。 – APC

+0

@APC是的,我的錯。無論如何,即使分區也可以正常工作。 – Matt

1
to_date('22/07/2015', 'DD/MM/YYYY') 

這將等於July, 22 2015 00:00:00

從甲骨文文件:MI:

Oracle數據庫在24小時格式-HH存儲時間SS。默認情況下, 日期字段中的時間爲00:00:00 A.M. (午夜)如果沒有時間 部分輸入。

因此action_date <=/>=將比較data+time

對於正確的結果,在date字段中添加所需的time。 如:

to_date('22/07/2015 12:56', 'DD/MM/YYYY HH24:MI') 
0

這比(原件)接受的答案,其中23:59後錯過的一小段時間更好。

select * 
from mytable 
where action_date >= to_date('01/07/2015', 'DD/MM/YYYY') 
and action_date < to_date('22/07/2015', 'DD/MM/YYYY') + 1; 

或者相反,如果你不喜歡+1:

select * 
from mytable 
where action_date >= to_date('01/07/2015', 'DD/MM/YYYY') 
and action_date < to_date('23/07/2015', 'DD/MM/YYYY'); 
+0

我接受了答案,因爲,延斯給出瞭解釋,爲什麼查詢混亂 – developer

+0

日期是在UI屏幕上從calander對象中選擇的對象。所以我可以使用你的第一個查詢。但我糾正了我的查詢並張貼了。 – developer

0

您可以使用下面的查詢。

select * 
from mytable 
where trunc(action_date) >= to_date('01/07/2015', 'DD/MM/YYYY') 
and trunc(action_date) <= to_date('22/07/2015', 'DD/MM/YYYY'); 

這將執行日期級別的比較,而不是一個基於日期和確切時間。

+0

這可行,但我不認爲甲骨文能夠使用'action_date'上的任何索引 –