SQL统计在线时长 怎么解

y347700830 2016-07-14 11:27:15
...全文
614 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
weixin_30840245 2017-03-01
  • 打赏
  • 举报
回复
思路:1.创建表,表作用是以用户名重新编排顺序,并获得新Id 2.update一个id2,目的是将同一账号最相近的登录时间进行匹配 3.取匹配的时间差,剔除大于要求的时间间隔,并汇总得到用户的登录时间。 DROP TABLE IF EXISTS ut; CREATE TABLE ut ( `id` INT(3) NOT NULL AUTO_INCREMENT COMMENT 'id', `name` VARCHAR(10) DEFAULT NULL COMMENT '用户账户名', `opdate` DATETIME DEFAULT NULL COMMENT '用户操作时间', id2 INT(3) DEFAULT NULL COMMENT '与前ID一致', PRIMARY KEY (`id`) ) ENGINE=MYISAM AUTO_INCREMENT=10 DEFAULT CHARSET=utf8; INSERT ut(NAME,opdate) SELECT user,time FROM o_user ORDER BY user; UPDATE ut SET id2=id-1; SELECT a.name,a.opdate,SUM(IF(TIMESTAMPDIFF(MINUTE,a.opdate,b.opdate)>20,0,TIMESTAMPDIFF(MINUTE,a.opdate,b.opdate))) t FROM ut a JOIN ut b ON a.name=b.name AND a.id=b.id2 GROUP BY a.name;
GCC-pig 2016-07-14
  • 打赏
  • 举报
回复
我的思路就是,按照人分组排序,然后针对同一个人的计算每次上网时间间隔,如果时间间隔小于等于20,则为上线时间,否则为下线状态,不做计算。
GCC-pig 2016-07-14
  • 打赏
  • 举报
回复
DROP TABLE IF EXISTS `o_user`;
CREATE TABLE `o_user` (
  `user` varchar(255) DEFAULT NULL,
  `time` datetime DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;


INSERT INTO `o_user` VALUES ('zhang', '2016-07-14 09:06:46');
INSERT INTO `o_user` VALUES ('lisi', '2016-07-14 09:07:58');
INSERT INTO `o_user` VALUES ('wang', '2016-07-14 09:08:10');
INSERT INTO `o_user` VALUES ('zhang', '2016-07-14 09:16:46');
INSERT INTO `o_user` VALUES ('lisi', '2016-07-14 09:47:58');
INSERT INTO `o_user` VALUES ('zhang', '2016-07-14 09:46:46');
INSERT INTO `o_user` VALUES ('lisi', '2016-07-14 09:57:58');
INSERT INTO `o_user` VALUES ('zhang', '2016-07-14 09:56:46');



select
temp.user,sum(sum_time) as sum_time
from(
select
m.*
, @end:=time as endtime
,case when m.user=@user then round((@sum:=unix_timestamp(@end)-unix_timestamp(@begin))/60 ,0)
else 0 end as sum_time
,@user:=m.user as temp_user 
, @begin:=time  as begin_time
from
  (select
  *
  from o_user
  order by user,time
)m,
(select  @user:='',@begin:=0,@end:=0,@sum:=0)n
)temp where temp.sum_time<=20
group by user 
zjcxc 2016-07-14
  • 打赏
  • 举报
回复
时长没有计算,我只算出了每个次在线的开始时间和结束时间 反正知道开始和结束时间算时长很简单,结束时间-开始时间,如果不需要分时间段,对这个值做一个 SUM,你自己加上就好了
zjcxc 2016-07-14
  • 打赏
  • 举报
回复
use dbi;

DROP TABLE IF EXISTS `o_user`;
 CREATE TABLE `o_user` (
   `user` varchar(255) DEFAULT NULL,
   `time` datetime DEFAULT NULL
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

 INSERT INTO `o_user` VALUES 
 ('a', '2016-07-14 09:06:46'),
 ('b', '2016-07-14 09:07:58'),
 ('a', '2016-07-14 09:11:10'),
 ('b', '2016-07-14 09:12:46'),
 ('a', '2016-07-14 10:07:58'),
 ('b', '2016-07-14 10:08:10'),
 ('b', '2016-07-14 10:18:10');
 
  select user, _g, min(time) as start_time, max(time) as finish_time
  from(
 select data.*
	, @i:=if(@u=user,if(time<@t, @i, @i+1), 1) as _g
    , @u:=user, @t:=time + INTERVAL 20 MINUTE  -- 持续在线的时间间隔
 from o_user data,(select @u:=null, @t:='0000-1-1') id
 order by data.user, data.time
  ) x group by user, _g
y347700830 2016-07-14
  • 打赏
  • 举报
回复
DROP TABLE IF EXISTS `o_user`; CREATE TABLE `o_user` ( `user` varchar(255) DEFAULT NULL, `time` datetime DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8; -- ---------------------------- -- Records of o_user -- ---------------------------- INSERT INTO `o_user` VALUES ('zhang', '2016-07-14 09:06:46'); INSERT INTO `o_user` VALUES ('lisi', '2016-07-14 09:07:58'); INSERT INTO `o_user` VALUES ('wang', '2016-07-14 09:08:10'); INSERT INTO `o_user` VALUES (null, null);
ACMAIN_CHM 2016-07-14
  • 打赏
  • 举报
回复
建议你列出你的表结构,并提供测试数据以及基于这些测试数据的所对应正确结果。 参考一下这个贴子的提问方式http://bbs.csdn.net/topics/320211382 1. 你的 create table xxx .. 语句 2. 你的 insert into xxx ... 语句 3. 结果是什么样,(并给以简单的算法描述) 4. 你用的数据库名称和版本(经常有人在MS SQL server版问 MySQL) 这样想帮你的人可以直接搭建和你相同的环境,并在给出方案前进行测试,避免文字描述理解上的误差。

56,678

社区成员

发帖
与我相关
我的任务
社区描述
MySQL相关内容讨论专区
社区管理员
  • MySQL
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧