如何获取 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' 上的聚集因子可能较低).
不过不要依赖它 -- 这可能是一个无法通过索引显着改进的查询。
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' 上的聚集因子可能较低).
不过不要依赖它 -- 这可能是一个无法通过索引显着改进的查询。