Oracle查询按分钟计算连接数,并提供开始和结束时间

时间:2015-04-13 15:58:06

标签: oracle

我连接到系统和数据库中我有用户名,starttime_of_connection和endtime_of_connection。我希望能够按分钟检查每分钟有多少连接处于活动状态。这是使用Oracle DB。有什么建议或帮助吗?

2 个答案:

答案 0 :(得分:1)

假设starttime_of_connectionendtime_of_connection是日期或时间戳列,您可以执行以下操作。我今天在each_minute公用表表达式(CTE)中动态生成每分钟的日期。您可以将其扩展为生成多天的日期,或者替换您已有的其他表格,以便为您提供每分钟的数据。

WITH each_minute AS (
  SELECT trunc(sysdate) + numtodsinterval( level, 'minute' ) dt
    FROM dual
 CONNECT BY level <= 24*60
)
SELECT em.dt, count(*) num_active_connections
  FROM each_minute em
       LEFT OUTER JOIN your_table yt
         ON( em.dt BETWEEN yt.starttime_of_connection AND yt.endtime_of_connection )

我还假设endtime_of_connection总是被填充 - 您可以使用NULL endtime_of_connection来表示尚未结束的连接,在这种情况下,您的连接将类似于

ON(    em.dt BETWEEN yt.starttime_of_connection AND yt.endtime_of_connection
    OR (em.dt >= yt.starttime_of_connection AND yt.endtime_of_connection IS NULL) )

答案 1 :(得分:0)

此查询对我有用:

with period as (select date '2015-04-01' d1, 
                       date '2015-04-30' + 1 - interval '1' minute d2 from dual),
tmp as (
  select d1, d2, trunc(starttime_of_connection, 'mi') soc, 
      trunc(nvl(endtime_of_connection, greatest(starttime_of_connection, d2)), 'mi') eoc
    from connections, period),
cn as (select greatest(soc, d1) cd1, least(eoc, d2) cd2 
    from tmp where soc<=d2 and eoc>=d1),
mt as (select d1 + (level-1)/(24*60) m 
    from period connect by d1 + (level-1)/(24*60) <= d2)
select to_char(m, 'mm-dd hh24:mi') minute, count(cd1) cnt 
  from mt /*left*/ join cn on m between cd1 and cd2
  group by m order by m

SQLFiddle demo

在第一行,请更改分析期间的日期。如果您想显示没有连接的分钟,例如要创建图表,请将底部的join更改为left join。 对于大量连接和长时间查询可能执行很长时间。如果是这样,您可以将期间分为周末/天和工会结果。

子查询tmp将日期截断为分钟,并填充空值连接的结束时间。 cn将之前的结果过滤到有趣的时期。 mt是分层分钟生成器。 主查询连接连接cn和分钟mt,按时间对它们进行分组。

如果有连接从小时23:34:07开始并在23:34:45结束,则计入分钟23:34。