如何获取 1 小时的数据

How can i get data on 1 hour basis

date_time                Data         Status

2015-04-15 17:40:20.0    18.5786        op

2015-04-15 16:20:59.0    16.7868        do

2015-04-15 16:20:55.0    24.58903       No

2015-04-14 16:21:00.0    24.289028      ok

2015-03-15 16:20:59.0    16.51689       dok

2015-04-16 16:20:55.0    24.789028      Nto

2015-02-15 17:55:59.0    28.784145      doq

2015-02-16 17:45:59.0   28.701414   dq

2015-04-18 17:15:59.0   25.784145   q

2015-04-10 15:15:19.0   21.784145   qq

三列是 date_time、数据和状态,我想获取 17:00:00-17:59:59hrs 之间的所有数据..这意味着我想获得 4 个输出。 我正在尝试分组但没有得到它。 我怎样才能得到它?- 有什么想法吗?

输出,我想得到-=

date_time               Data      Status

2015-04-15 17:40:20.0   18.5786     op

2015-02-15 17:55:59.0   28.784145   doq

2015-02-16 17:45:59.0   28.701414   dq

2015-04-18 17:15:59.0   25.784145   q

如果 EXTRACT() 有效,那就太好了,可惜我们只能从时间间隔和时间戳中提取时间元素,而不是日期。

SQL> select * from your_table
  2  where extract(hour from date_time) = '17';
where extract(hour from date_time) = '17'
                        *
ERROR at line 2:
ORA-30076: invalid extract field for extract source


SQL>

更新:

查看您发布的示例数据 date_time 可能是时间戳。在这种情况下,EXTRACT() 将起作用。看看这个。

 SQL> select col1, date_time from your_table
   2  /

 COL1  DATE_TIME
 ----  ----------------------------
 ABC1  02-MAY-15 03.39.34.000000 AM    
 ABC2  30-APR-15 03.39.34.000000 PM
 ABC3  30-APR-15 03.39.34.000000 AM
 ABC4  28-APR-15 03.39.34.000000 PM

 SQL> select col1, date_time from your_table
   2  where extract(hour from date_time) = 3
   3  /

 COL1  DATE_TIME
 ----  ----------------------------
 ABC1  02-MAY-15 03.39.34.000000 AM
 ABC3  30-APR-15 03.39.34.000000 AM

 SQL> 

但是,如果您的数据类型只是 DATE,也不会丢失所有内容。 n Oracle 我们可以对日期进行算术运算。 T运行给一个日期给我们午夜的一天。然后我们可以为时间元素添加一个分数,如下所示:

select * from your_table
where date_time >= trunc(date_time)+(17/24)
and date_time < trunc(date_time)+(18/24)

请注意,如果您有大量行(这是一个完整的 table 扫描),这样的查询可能会执行得很糟糕。根据您的其他业务需求,有多种解决方案。

如果您需要 运行 这样的查询,通常一种方法是提取时间元素。在 11g 或更高版本中,您可以使用虚拟列和索引,但在 10g 中,您只能使用基于函数的索引。

create index your_table_time_fbi on 
    your_table(to_number(to_char(date_time, 'SSSSS')));

这使用 SSSSS 日期掩码来提取从午夜算起的秒数。要使用索引,您需要更改之前的查询,使其看起来像这样:

select * from your_table
where to_number(to_char(date_time, 'SSSSS')) >= (17*3600)
and to_number(to_char(date_time, 'SSSSS')) < (18*3600)

你可能:

select ...
from   ...
where  to_char(date_time,'HH24') = '17'

在表达式 to_char(date_time,'HH24') 上放置一个索引,您可能会提高性能,但这取决于数据中值的分布。

如果 1/24 的行满足条件,那么索引可能会有所帮助,但如果更接近 1/12,则不太可能。

可能对您有利的是,如果这是一个日志 table,那么这些行在 to_char(date_time,'HH24' 上的聚集因子可能较低).

不过不要依赖它 -- 这可能是一个无法通过索引显着改进的查询。