2016-09-27 84 views
0

我有一个表来注册用户日志之间差每隔一分钟和其他活动用的DateTime每个查找总活性小时user_id说明通过计算TIMEDATE记录

这是我的表中的一个样本数据

id | user_id |  log_datetime 
------------------------------------------ 
1 |  1  | 2016-09-25 13:01:08 
2 |  1  | 2016-09-25 13:04:08 
3 |  1  | 2016-09-25 13:07:08 
4 |  1  | 2016-09-25 13:10:08 
5 |  2  | 2016-09-25 13:11:08 
6 |  1  | 2016-09-25 13:13:08 
7 |  2  | 2016-09-25 13:13:09 
8 |  2  | 2016-09-25 13:14:10 

我想计算总活性时间系统上


UPDATE:预期输出

对于实例user_id 1周他的总可用时间应该是0点12分零零秒

因为他的时间和秒是一样的,所以我就减去最后的日志从先前然后上一个从下一个先前等等,那么我会总结所有扣除值 这是一个简单的

只是我想循环通过数据从最后一个记录到第一个记录与我的范围

这是一个简单的公式希望使我的问题明确

SUM((T < N> - T的< N-1>)+(T < N-1> - T的<的n-2> )... +(T < NX> - T的<正第一>))

由于user_id 1他小时相同,则我将计算分钟只。

(13-10)+(10-7)+(7-4)+(4-1)= 12

user_id |  total_hours 
--------------------------------- 
    1  |  00:12:00 
    2  |  00:03:02 

我这样做代码

SET @start_date = '2016-09-25'; 
SET @start_time = '13:00:00'; 

SET @end_date = '2016-09-25'; 
SET @end_time = '13:15:00'; 

SELECT 
`ul1`.`user_id`, SEC_TO_TIME(SUM(TIME_TO_SEC(`dl1`.`log_datetime`))) AS total_hours 
FROM 
`users_logs` AS `ul1` 
JOIN `users_logs` AS `ul2` 
    ON `ul1`.`id` = `ul2`.`id` 

WHERE 
`ul1`.`log_datetime` >= CONCAT(@start_date, ' ', @start_time) 
AND 
`ul2`.`log_datetime` <= CONCAT(@end_date, ' ', @end_time) 


GROUP BY `ul1`.`user_id` 

但是这个代码总和所有时间没有得到区别。这是代码

user_id |  total_hours 
--------------------------------- 
    1  |  65:35:40 
    2  |  39:38:25 

的输出如何计算所有差异日期时间的总和,那么,我想显示他的有效时间的每12小时(00:00:00 - 11: 59:59)(12:00:00 - 23:59:59)在选定日期时间周期的代码

的开头,以便输出应该是这样的(只是一个虚拟实例而不是从给定的数据)

user_id | total_hours | 00_12_am | 12_00_pm | 
------------------------------------------------------- 
    1  | 10:10:40 | 02:05:20 | 08:05:20 | 
    2  | 04:10:20 | 01:05:10 | 03:05:30 | 

谢谢

+0

你需要获得'TIME_TO_SEC(@start_time)'你的开始时间和减去从你的'TIME_TO_SEC(dl1.log_datetime)'给你13秒:00:00。 TIME_TO_SEC总是从00:00:00开始,这就是为什么你的价值如此膨胀的原因。 –

+0

表中的条目代表什么?登录时间?注销时间?用户使用该系统的第二个阶段?看起来没有任何上下文的时间戳表看起来很奇怪。人们宁愿期望一个时间跨度表,即开始时间和结束时间。或者至少用时间和动作记录('登录'/'注销')。 –

+0

@ R.Chappell实际上,因为我有超过1000条记录,所有用户都在测试特定时间的代码,所以我可以手动计算以查看我的代码是否返回正确的输出。我通常在00:00:00设置'@ start_time',并在23:59:59设置'@ end_time' – ahmadssb

回答

1

所以你记录每分钟,如果用户可以有一个日志条目。

然后计算每个用户的日志数,以便获得总分钟数。

select user_id, count(*) as total_minutes 
from user_logs 
group by user_id; 

如果你希望他们显示为一次性使用SEC_TO_TIME:

select user_id, sec_to_time(count(*) * 60) as total_hours 
from user_logs 
group by user_id; 

对于条件汇总:

select 
    user_id, 
    count(*) as total_minutes, 
    count(case when hour(log_datetime) < 12 then 1 end) as total_minutes_am, 
    count(case when hour(log_datetime) >= 12 then 1 end) as total_minutes_pm 
from user_logs 
group by user_id; 

UPDATE:为了计算每分钟只有一次计数明显分钟,即DATE_FORMAT(log_datetime, '%Y-%m-%d %H:%i')。这可以通过COUNT(DISTINCT ...)或通过获取不同值的子查询来完成。

完整的查询:

select 
    user_id, 
    count(*) as total_minutes, 
    count(case when log_hour < 12 then 1 end) as total_minutes_am, 
    count(case when log_hour >= 12 then 1 end) as total_minutes_pm 
from 
(
    select distinct 
    user_id, 
    date_format(log_datetime, '%y-%m-%d %h:%i') as log_moment, 
    hour(log_datetime) as log_hour 
    from.user_logs 
) log 
group by user_id; 
+0

还有其他活动,例如回复邮件或更改票券状态或任何将在同一分钟内存储在他的日志中的内容 请检查我对问题的更新以了解给定数据的预期输出 – ahmadssb

+1

好吧,我已经更新了我的答案。希望对你有效。我仍然坚持计数分钟。看到我对上面您更改的请求的评论。 –

+0

我已检查过您的代码逻辑,正在计算每个用户有多少条记录并将其计为1分钟。但事实上用户可能会延迟几秒钟或用户可能在同一分钟内做某些事情,所以在这种情况下,在您的代码中,您将此记录计为一分钟,这是错误的。 – ahmadssb