通过计算TimeDate记录之间的差异来查找总活动小时数

时间:2016-09-27 08:53:08

标签: mysql

我有一个表来每隔一分钟注册用户日志,并使用日期时间为每个 user_id

进行其他活动

这是我表的样本数据

public static extern void NotWorkFunction(out IntPtr pOut, int someConst)

void Main(string[] args)
{
  IntPtr pOut;
  int dataLength;
  string foo;

  NotWorkFunction(pOut, dataLength);
  foo = Marshal.PtrToStringAuto(pOut);
  BlockFree(pOut);
}

我想计算系统上的总活动时间

更新:预期输出

例如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 1,他的总可用时间应 00:12:00

由于他的小时和秒数是相同的,所以我将从前一个上一个日志中减去上一个日志,依此类推,然后我将对所有减去的值求和

这很简单

我想简单地将上一条记录中的数据循环到我的范围内的第一条记录

这是一个简单的公式我希望能让我的问题清楚

SUM((T n -T n-1)+(T n-1 -T n-2)... +(T -T<(T< n> -T< n-1> ; n-first>))

由于user_id 1 小时相同,我只会计算分钟

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

user_id

我做了这段代码

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`

如何计算所有差异日期时间的总和,然后我想显示每 12小时的活跃时间 (00:00:00 - 11 :59:59)(12:00:00 - 23:59:59),在代码开头的选定日期时段

因此输出看起来像这样(只是一个虚拟的例子而不是来自给定的数据)

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

谢谢

1 个答案:

答案 0 :(得分: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;

更新:为了计算每分钟只计算一次不同的分钟,即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;