2012-08-11 51 views
0

我的查詢看起來是這樣的:預言:MI

select * 
from mytable 
where date_field between to_date(#from#, 'YYYY/MM/DD HH24:MI') 
    and to_date(#to#, 'YYYY/MM/DD HH24:MI') 

舉個例子:

if from = 2012/07/18 00:00 and 
    to = 2012/07/18 00:09 

將在包括時間戳2012/07/18 00:09:01記錄2012/07/18 00:09:59

,或者我應該改變聲明:

select * 
from mytable 
where date_field >= to_date(#from#, 'YYYY/MM/DD HH24:MI') 
    < to_date(#to#, 'YYYY/MM/DD HH24:MI') 

這裏代從:2012/07/18 00:00 &至:2012/07/18 00:10應該給我的所有記錄與時間戳之間午夜& 9M59S過去的午夜,這是我想要的。

回答

0

忽略DATE元素的日期部分,因爲00:09:01和00:09:59都會在00:09:00的「到」時間之後,否,此查詢將不包含這些記錄。

如果您想包含這些記錄,您需要將您的記錄的時間戳延長至最接近的分鐘,以便將您的「到」時間延長至00:10:00或TRUNC

編輯:

如果你從和只精確到分鐘,我應該這樣做:

SELECT * 
    FROM mytable 
WHERE date_field >= to_date(#from#, 'YYYY/MM/DD HH24:MI') 
    AND date_field < to_date(#to#, 'YYYY/MM/DD HH24:MI') + 1/24/60/60 /* 1 minute */ 

並確保您使用綁定變量從和。這是ColdFusion嗎?如果是這樣,請使用cfqueryparam

+0

由於日期是包含性的,如果我使用00:10:00這不包括10嗎?我想排除它! – iyerland 2012-08-11 15:06:55

+0

正確,它會。 BETWEEN是「start <= foo和foo <= end」的縮寫。 – eaolson 2012-08-11 17:53:11

0

日期轉換將把值轉換爲包含所有日期元素的日期。您沒有在字符串中指定秒數,因此這些值將變爲0.

換句話說,不包括範圍「:01」 - 「:59」。

既然你處理字符串與琴絃有正確的順序日期元素作比較,爲什麼不這樣做字符串比較來代替:

where to_char(datefield, 'YYYY/MM/DD HH24:MI') between #from# and #to# 

我想,這不正是你想要的東西,不與周圍順藤摸瓜日期算術。

您也可以按照您的建議更改陳述,方法是遞增#至#列,並使用「<」而不是兩者之間的值。

+1

請注意,這可能會阻止在'date_field'上使用索引。 – 2012-08-11 16:04:07

+1

這可以通過在Oracle中創建基於函數的索引來處理。 。 。 http://docs.oracle.com/cd/E14072_01/server.112/e10592/statements_5012.htm。順便說一下,在舍入日期或做其他日期算術時,你會遇到同樣的問題。 – 2012-08-11 16:08:21

+0

我們確實希望使用該索引,因爲此調用需要高性能! – iyerland 2012-08-11 16:09:04

0

你可以做這樣的事情:

SELECT * 
    FROM mytable 
WHERE date_field between to_date(#from#, 'YYYY/MM/DD HH24:MI') 
    AND to_date(#to#||':59', 'YYYY/MM/DD HH24:MI:SS') 
1

子句之間接受的區間邊界。 我建議第二個選項,你

select * 
from mytable 
where date_field >= to_date(#from#, 'YYYY/MM/DD HH24:MI') 
    < to_date(#to#, 'YYYY/MM/DD HH24:MI') 

您可能會發現this article有趣。