2015-09-08 232 views
1

我只是試圖在特定的時間戳範圍內獲取結果。我僅給出日期,因此我將「00:00:01」添加到最新版本,並將「23:59:59」添加到迄今爲止。Oracle查詢中的時間戳範圍

我已經試過

WHERE DATE_SENT > (to_timestamp($P{FROM_DATE}||'00:00:01')) 
DATE_SENT < (to_timestamp($P{TO_DATE}||'23:59:59')) 

WHERE DATE_SENT BETWEEN (to_timestamp($P{FROM_DATE}||'00:00:01')) AND (to_timestamp($P{TO_DATE}||'23:59:59')) 

然而,無論似乎工作。如果日期和日期都是同一日期,我只是不會收到任何數據。當我使用to_date並刪除時間部分時,使用< =和> =並且兩個日期相同,我再也沒有結果。

我讀到'BETWEEN'是包容性的,但在結果中沒有看到。表格字段實際上是時間戳。

回答

0

是,BETWEEN包括範圍的條件之間。

這個問題似乎是缺少業態模式,由於它的區域設置特定的客戶端NLS設置可能適用,因此表現出不正確的行爲。

此外,你可以簡單地使用TO_DATE而不是TO_TIMESTAMP爲日期數據類型日期和時間元素。

WHERE DATE_SENT 
BETWEEN TO_DATE($P{from_date}||'00:00:01', '<date_format>HH24:MI:SS') 
AND  TO_DATE($P{to_Date} ||'23:59:59',''<date_format>HH24:MI:SS') 

確保將正確的<date_format,例如,'MM/DD/YYYY'

您也可以使用ANSI Timestamp Literal如果您的日期格式可以被你提前爲YYYY-MM-DD HH24:MI:SS

WHERE DATE_SENT 
BETWEEN TIMESTAMP '$P{from_date}'||'00:00:01' 
AND  TIMESTAMP '$P{to_Date}' ||'23:59:59' 
1

首先檢查該字段實際上是一個時間戳因爲你看起來只是在處理粒度到DATE數據類型完全支持的第二個粒度。其次,當涉及到DATE或TIMESTAMP的轉換時,對NLS設置使用的默認格式做出假設是一個壞主意,正如依賴於受格式影響的任何種類的隱式轉換一樣。請記住Timestamp數據類型包含小數秒。因此,如果它是一個時間戳列而不是日期,並且如果以格式「YYYY/MM/DD」中的字符串獲取日期,則請執行以下操作:

to_timestamp($ P {FROM_DATE} || '00:00:01.000000','YYYY/MM/DD HH24:MI:SS.FF')

確保它將您的字符串轉換爲正確的日期。

可能發生的情況是,字符串參數和默認日期格式不同步,所以它所確定的時間戳不在數據範圍內。

如果基礎字段是一個日期,那麼同樣的方法也適用 - 只需使用TO_DATE代替TO_TIMESTAMP並調整格式掩碼適當

0

只需使用日期!沒有理由隨着時間的組件來擺弄,當你可以只使用不平等的日期:

WHERE DATE_SENT >= to_timestamp($P{FROM_DATE}) 
     DATE_SENT < to_timestamp($P{TO_DATE}) + 1 

或者,你喜歡,+ interval 1 day

+0

'TO_DATE'和'TO_TIMESTAMP [_TZ]'功能應該總是(如總是)包括格式掩碼,以避免在'NLS_DATE_FORMAT'和/或'NSL_TIMESTAMP [_TZ] _FORMAT'設置變化引起的錯誤。 – Sentinel