我连接到系统和数据库中我有用户名,starttime_of_connection和endtime_of_connection。我希望能够按分钟检查每分钟有多少连接处于活动状态。这是使用Oracle DB。有什么建议或帮助吗?
答案 0 :(得分:1)
假设starttime_of_connection
和endtime_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
在第一行,请更改分析期间的日期。如果您想显示没有连接的分钟,例如要创建图表,请将底部的join
更改为left join
。
对于大量连接和长时间查询可能执行很长时间。如果是这样,您可以将期间分为周末/天和工会结果。
子查询tmp
将日期截断为分钟,并填充空值连接的结束时间。
cn
将之前的结果过滤到有趣的时期。 mt
是分层分钟生成器。
主查询连接连接cn
和分钟mt
,按时间对它们进行分组。
如果有连接从小时23:34:07开始并在23:34:45结束,则计入分钟23:34。