2010-02-26 304 views
10

我們有一個包含DATE列d的表格。Oracle:僅比較日期與小時

我想要得到d列大於/小於某個值的所有行,無論日期如何。

例如

|  d   | 
------------------- 
|2009/11/1 15:55:23| 
-------------------- 
|2009/11/2 15:55:23| 
-------------------- 
|2009/11/3 15:55:23| 
-------------------- 
|2009/11/3 17:55:23| 
-------------------- 

例如,如果我想所有的記錄標記下午5點以後:

select d 
from my_table 
where extract(hour from d) > TO_DATE ('17:00:00','HH24:MI:SS') 

這應該只返回一個記錄

|2009/11/3 17:55:23| 

我不t知道這是否是最好的方法,但是我在提取功能中遇到錯誤:

ORA-30076: invalid extract field for extract source 
Cause: The extract source does not contain the specified extract field. 

有沒有更好的方法來做到這一點? 這個錯誤怎麼了?提取僅適用於sysdate,就像我找到的所有示例一樣?

在此先感謝

+0

那麼您是否發現了一個通用解決方案,使用HOUR字段和EXTRACT?我需要一個跨DBMS兼容的解決方案。 – 2012-05-10 09:34:06

回答

12

這個怎麼樣?

select d 
from my_table 
where to_char(d,'HH24') > '16'; 
+0

順便說一下,'小時'只支持基於谷歌搜索的時間戳類型。 這種情況下的性能問題?只是好奇。 – exiter2000 2010-02-26 16:52:44

+0

是的,性能是一個問題 – Tom 2010-02-26 18:08:18

+2

考慮一個基於函數的索引上面的表達式:'CREATE INDEX my_table_fbi01 on my_table(to_char(date_col,'HH24'));'然而,考慮到你的例子,性能可能仍然是不理想的。假設您的日期列的小時模式沒有差異,您仍然會獲得1/3的數據,所以索引對您無幫助。 – 2010-02-26 18:32:43

4

試試這個:

select d from my_table 
where (d-trunc(d)) > 16/24; 
7

沒有一個Oracle數據庫與此刻的測試,但我認爲下面應該工作:

SELECT * 
    FROM MY_TABLE t 
    WHERE EXTRACT(HOUR FROM CAST(t.D AS TIMESTAMP)) > 16; 

但我不明白爲什麼CAST將需要爲this page說HOUR是DATE中的有效字段。

分享和享受。

+1

這個[page](http://docs.oracle.com/cd/B28359_01/server.111/b28286/functions052.htm)解釋了爲什麼你需要轉換爲TIMESTAMP:_「EXTRACT將expr解釋爲ANSI datetime數據類型。例如,EXTRACT將DATE視爲傳統Oracle DATE,而不是作爲ANSI DATE,而不包含時間元素。「_ – 2014-10-14 13:04:41