小介绍。
我有两个表,其中一个称为date_time,列date_time_key包含15分钟的unix格式的时间戳 第二个表代理包含用户的数据,包括login_time和logout_time。
我的问题是。我可以创建15分钟的统计信息来记录有多少用户吗? 目前,我能够从date_time获取Unix时间戳列表。并分别从第二个表中获取登录和注销时间。
select date_time_key from date_time
where label_date = '2018-07-23';
select start_time, end_time from agents;
希望您能理解, 感谢您的帮助
编辑:
表date_time以15分钟为步长以unix纪元格式(1532510096)包含时间戳。
我希望输出为
Date Time Count_of_agents
2018-07-24 10:00 20
2018-07-24 10:15 22
etc ..
答案 0 :(得分:0)
假设date_time_key,start_time,end_time是日期格式,要获取所有座席信息,您可以执行以下操作:
select a.*,
b.date_time_key
from agents a,
date_time b
where start_time <= b.date_time_key
and end_time >= b.date_time_key
如果date_time_key是字符格式的时间戳,则您需要对其进行格式化,在oracle中,它看起来像这样:
select a.*,
b.date_time_key
from agents a,
date_time b
where a.start_time <= TO_DATE(b.date_time_key,'YYYYMMDDHH24MISS')
and a.end_time >= TO_DATE(b.date_time_key,'YYYYMMDDHH24MISS')
该SQL未经测试且考虑到oracle函数,请提供更多详细信息,以了解如果使用的rdbms不能帮助您
答案 1 :(得分:0)
如果我理解正确,则需要从Unix纪元转换为日期/时间格式。如果是这样:
select dt.dte, count(*)
from (select dt.*,
(timestamp '1970-01-01 00:00:00') + date_time / (24 * 60 * 60) as dte
from date_time dt
) dt left join
agents a
on dte >= login_time and dte <= logout_time
where dt.label_date = '2018-07-03'
group by dt.dte
order by dt.dte;
答案 2 :(得分:0)
类似
SELECT a.date_time_key unixdate,count(*) count_of_agents
FROM date_time a, agents b
WHERE b.end_time>=a.date_time_key and b.start_time<=a.date_time_key+15*60
GROUP BY by a.date_time_key
如何将unixtime转换为可以在Internet上找到的oracle日期。这是example
答案 3 :(得分:0)
谢谢您的回答。最后,我创建了自己的解决方案。
简体:
with X as
(
-- get all 15 minutes timestamps i want
select start_time, end_time
from agents
where start_time > 1532476903 and end_time < 1532559703
)
select label_date, count(label_date)
from date_time
-- join agent to date_time table if timestamp lies between agents login and logout
right join X on X.start_time < dt.date_time_key
and X.end_time > dt.date_time_key
group by label_date
order by label_date
这不是有效或美观的解决方案,但可以正常工作