2010-02-26 170 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