我有一个表来每隔一分钟注册用户日志,并使用日期时间为每个 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
由于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
谢谢
答案 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;