我想请求帮助实现以下场景,我们有一个记录用户活动的表,在单行中有;我们记录开始和停止时间,并在行中更新结束时间时使用mysql触发器计算持续时间。
以下是表格结构
---------------------------------------------------
USERs Activity Table
---------------------------------------------------
created_at Event User Start_timestamp End_Timestamp Duration
------------------- --------- ------- ------------------- ------------------- --------
2018-11-20 18:01:22 LOGIN john.doe 2018-11-20 18:01:22 2018-11-20 19:01:22 3600
2018-11-20 18:01:22 LOGIN jane.miller 2018-11-20 18:10:03 2018-11-20 20:10:03 7200
2018-11-20 18:15:16 BREAK john.doe 2018-11-20 18:15:16 2018-11-20 18:33:47 300
2018-11-20 18:33:47 ONCALL john.doe 2018-11-20 18:33:47 2018-11-20 18:36:47 180
我们想生成一个报告,可以给我们15分钟的间隔,所有用户如下所示
---------------------------------------------------
Desired Result in 15 minutes time interval
---------------------------------------------------
Intervals User LOGIN TIME BREAK TIME CALL TIME
------------------- ---------- ---------- ---------- ---------
2018-11-20 18:00:00 john.doe 00:15:00 00:00:00 00:00:00
2018-11-20 18:00:00 jane.miller 00:04:57 00:00:00 00:00:00
2018-11-20 18:15:00 john.doe 00:15:00 00:00:00 00:00:00
2018-11-20 18:15:00 jane.miller 00:15:00 00:00:00 00:00:00
2018-11-20 18:30:00 john.doe 00:15:00 00:15:00 00:00:00
2018-11-20 18:30:00 jane.miller 00:15:00 00:00:00 00:00:00
2018-11-20 18:45:00 john.doe 00:15:00 00:03:15 00:03:00
2018-11-20 18:45:00 jane.miller 00:15:00 00:00:00 00:00:00
2018-11-20 19:00:00 john.doe 00:01:22 00:00:00 00:00:00
2018-11-20 19:00:00 jane.miller 00:15:00 00:00:00 00:00:00
2018-11-20 19:15:00 jane.miller 00:15:00 00:00:00 00:00:00
2018-11-20 19:30:00 jane.miller 00:15:00 00:00:00 00:00:00
2018-11-20 19:45:00 jane.miller 00:15:00 00:00:00 00:00:00
2018-11-20 20:00:00 jane.miller 00:10:03 00:00:00 00:00:00
------------------- ---------- ---------- ----------
我无法做到的是,每个事件只有一行,如果我得到基于15分钟间隔的报告,我得到的是事件开始的间隔的总持续时间,在15分钟间隔中显示30分钟的时间看起来是不对的。但应显示,例如1个间隔3分钟,其他间隔12分钟;在每个间隔中花费的实际时间。
请说明如何做到这一点。我还创建了一个临时表,该表以15分钟的间隔填充,我希望根据该表生成数据并使用联接,但我不是sql方面的Maven,需要你们的帮助/建议。
下面是我一直在玩的问题,但到目前为止没有成功。
SELECT
DATE_FORMAT(SEC_TO_TIME(TIME_TO_SEC(a.created_at) - TIME_TO_SEC(a.created_at) % (15 * 60)),"%Y-%m-%d %H:%i") AS time_interval
, a.user
, SEC_TO_TIME(IFNULL(SUM(CASE WHEN a.event = 'LOGIN' THEN a.duration END),0)) AS login_time
, SEC_TO_TIME(IFNULL(SUM(CASE WHEN a.event = 'BREAK' THEN a.duration END),0)) AS break_time
, SEC_TO_TIME(IFNULL(SUM(CASE WHEN a.event = 'ONCALL' THEN a.duration END),0)) AS talk_time
FROM users_activity AS a
WHERE a.created_at > '2018-11-20 00:00:00'
GROUP BY time_interval, a.user
ORDER BY time_interval DESC;
sql篡改模式https://dbfiddle.uk/?rdbms=mysql_8.0&fiddle=0d64482c499a07e9d1c7ec232915969e
提前谢谢。
暂无答案!
目前还没有任何答案,快来回答吧!