Oracle:仅按小时比较日期

Tom*_*Tom 13 sql oracle plsql oracle11g

我们有一个DATE列d的表.

无论日期如何,我都希望得到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|
--------------------
Run Code Online (Sandbox Code Playgroud)

例如,如果我想要在下午5点之后标记的所有记录:

select d 
 from my_table 
where extract( hour from d ) > TO_DATE ('17:00:00','HH24:MI:SS') 
Run Code Online (Sandbox Code Playgroud)

这应该只返回一条记录

|2009/11/3 17:55:23|
Run Code Online (Sandbox Code Playgroud)

我不知道这是否是最佳方法,但我在提取函数上出错:

ORA-30076: invalid extract field for extract source 
Cause: The extract source does not contain the specified extract field.
Run Code Online (Sandbox Code Playgroud)

有一个更好的方法吗?这个错误怎么了?提取仅适用于sysdate,就像我发现的所有示例一样?

提前致谢

exi*_*000 14

这个怎么样?

select d 
from my_table
where to_char(d,'HH24') > '16';
Run Code Online (Sandbox Code Playgroud)

  • 考虑一个基于函数的索引上面的表达式:`上MY_TABLE(TO_CHAR(date_col的, 'HH24'))CREATE INDEX my_table_fbi01;`不过,鉴于你的榜样,表现将可能仍然unoptimal.假设你的日期列的每小时模式没有变化,你仍然会得到1/3的数据,所以索引对你没有帮助. (2认同)

Bob*_*ica 8

目前没有要测试的Oracle数据库,但我认为以下内容应该有效:

SELECT *
  FROM MY_TABLE t
  WHERE EXTRACT(HOUR FROM CAST(t.D AS TIMESTAMP)) > 16;
Run Code Online (Sandbox Code Playgroud)

但是我不明白为什么需要CAST,因为这个页面说HOUR是DATE中的有效字段.

分享和享受.

  • 这个 [页面](http://docs.oracle.com/cd/B28359_01/server.111/b28286/functions052.htm) 解释了为什么需要转换为 TIMESTAMP:_"EXTRACT 将 expr 解释为 ANSI 日期时间数据类型。例如, EXTRACT 将 DATE 视为不带时间元素的 ANSI DATE,而不是传统的 Oracle DATE。"_ (2认同)

a'r*_*a'r 5

尝试这个:

select d from my_table 
where (d-trunc(d)) > 16/24; 
Run Code Online (Sandbox Code Playgroud)