给定开始时间,结束时间和秒。在特定小时内获得秒数

时间:2010-02-26 17:19:51

标签: sql database vertica

我正在使用Vertica数据库。我试图从以下示例会话数据中获取特定小时内的总秒数。任何示例SQL代码都非常有用 - 谢谢

         start time        end time           session length(secs) 
 2010-02-21 20:30:00      2010-02-21 23:30:00    10800
 2010-02-21 21:30:00     2010-02-21 22:30:00     3600
 2010-02-21 21:45:00      2010-02-21 21:59:00      840
 2010-02-21 22:00:00     2010-02-21 22:20:00     1200
 2010-02-21 22:30:00      2010-02-21 23:30:00     3600

期望输出

hour   secs_in_that_hour
20         1800
21         6240
22         8400
23         3600

4 个答案:

答案 0 :(得分:0)

您需要一个包含每小时的表格,以便您可以加入。该连接将基于开始和结束时间内的小时,然后您可以使用(min(小时结束,结束时间)提取时间) - 最大(小时开始,开始时间))。然后分组小时和总和。

由于我不知道vertica,我对此没有完整的答案。

答案 1 :(得分:0)

Vertica基于PostgresSQL,尤其是语言方面。您可以做的最好的事情是查找Postgres的日期时间函数和相关教程。我还没有找到Postgres时间函数在Vertica中不起作用的实例。

http://www.postgresql.org/docs/8.0/interactive/functions-datetime.html

您可以使用日期类型函数。 (对不起,我没时间查阅。)

答案 2 :(得分:0)

请参阅Vertica功能

TIMESERIES条款

  

提供间隙填充和插值(GFI)计算,这是时间序列分析计算的重要组成部分。有关详细信息和示例,请参阅“程序员指南”中的使用时间序列分析。

语法

TIMESERIES slice_time AS 'length_and_time_unit_expression' OVER (
... [ window_partition_clause (page 147) [ , ... ] ]
... ORDER BY time_expression )
... [ ORDER BY table_column [ , ... ] ]

答案 3 :(得分:0)

最简单的方法是在间隔(时间戳之间的差异)上提取纪元(秒数)。

至于重叠的金额,你需要先按小时分解。其中一些时间不存在,因此您需要使用TIMESERIES子句生成它们。

这个想法是首先创建你的每小时时间片,然后你就加入找到(并扇出)所有可能的匹配。这基本上是寻找时间范围的任何和所有重叠。幸运的是,这非常简单,因为它只是在切片结束之前的开始时间和结束时间大于切片开始的任何地方。

然后你使用最大值和最小值来找到在切片内开始和停止的实际时间,将它们减去,将间隔转换为秒并完成。

请参阅下面的示例。

with slices as ( 
  select slice_time slice_time_start, slice_time + interval '1 hour' slice_time_end
  from (
    select min(start_time) time_range from mytest
    union all
    select max(end_time) from mytest
  ) range
  timeseries slice_time as '1 HOUR' over (order by range.time_range)
)
select slice_time_start "hour", extract(epoch from sum( least(end_time, slice_time_end)-greatest(slice_time_start, start_time))) secs_in_that_hour
from slices join mytest on ( start_time < slice_time_end and end_time > slice_time_start)
group by 1
order by 1

如果您的数据不那么干净,可能会出现一些边缘情况或需要额外的过滤。