84669 人学习
152542 人学习
20005 人学习
5487 人学习
7821 人学习
359900 人学习
3350 人学习
180660 人学习
48569 人学习
18603 人学习
40936 人学习
1549 人学习
1183 人学习
32909 人学习
有一张日志表,记录着每个用户的操作日志信息,例如登录或注销,每个操作都有对应的createtime,以及当前的userName
需求如下:
统计每个用户在一天内在线时长(登录到注销这段时间,可能一天登录注销多次)
如果用户电脑直接关机,或者非正常关闭系统,这时日志表不会产生注销日志,所以将用户最后一次的操作日志(可能是增删改查)作为注销时间,进行在线时长的计算
疑问:
我觉得在日志记录的时候需要记录每次会话的sessionId,否则无法进行上面计算?
闭关修行中......
不需要记录sessionid,你想用sessionid来记录非正常退出最后一次操作时间?针对同一个用户登录的上一条数据一定是退出操作1.正常退出,下边一条一定是登录2.普通操作(增删改查)后非正常关闭,下一次也一定是登录操作
所以一次登录时间长度为本次登录时间--下次登录前一条记录的时间
但是如果用户非正常关闭后没在登录就需要单独处理,比如sessionid20分钟没操作就过期,就查看最后一条记录距离当前是否超过20分钟,超过就认为已经非正常退出。
反正得有用户标示,去判断是哪个用户的行为日志,
写日志的时候再写上每次登陆登出的时间差到日志,最后相加?
表可以这样设计
用户id 登录时间 退出时间
登录的时候,session中记录登录时间,同时把退出时间设置为:登录时间+超时时间。
用户活动的时候,根据session中记录的登录时间,去更新那条记录的退出时间为:当前时间+超时时间。
退出的时候,根据session中记录的登录时间,去更新那条记录的退出时间为:当前时间。
原始表(假设):
record_id uid name opr_type c_time 1 10 cxl land 2016-12-26 08:00:00 2 10 cxl out 2016-12-26 23:00:00
最终生成的表:
用户名 日期(asc) 当天第一次登陆时间 当天最后一次登出时间 登陆时长(结果非准确值) cxl 2016-12-26 2016-12-26 08:00:00 2016-12-26 15:00:00 3小时10分 cxl 2016-12-27 2016-12-26 08:30:00 2016-12-26 23:00:00 6小时10分
具体流程:
1. 日期分组 2. 当天第一次登陆时间 2.1 第一种情况:若当天第一条记录操作类型是 登出,那么 当天第一次登陆时间 = 00:00:01 2.2 第二种情况:若当天第一条记录操作类型是 登陆,那么 当天第一次登陆时间 = c_time 3. 当天最后一次登出时间 3.1 第一种情况:若当天最后一条记录操作类型是 登陆,那么 当天最后一次登出时间 = 23:59:59 3.2 第二种情况:若当天最后一条记录操作类型是 登出,那么 当天最后一次登出时间 = c_time 4. 登陆时长 4.1 当天最后一次登出时间 - 当天第一次登陆时间
提供下思路哈,具体实现起来个人觉得很不容易(逻辑处理需用到php,分页的时候也较麻烦,得按照日期进行分页显示,而不能像 limit 1 , 10 这样按取出的记录数进行分页 ,单sql无法得出最终表结构),所以,就只能到这儿了....
limit 1 , 10
借问题请教一下大家哈? 登陆可以记录,登出怎么记录呢? 用户不一定真的就点登出按钮啊。如果是web的话,用户可以直接关闭浏览器就不关了,怎么知道什么时候登出的呢? session吗?
不需要记录sessionid,你想用sessionid来记录非正常退出最后一次操作时间?
针对同一个用户登录的上一条数据一定是退出操作
1.正常退出,下边一条一定是登录
2.普通操作(增删改查)后非正常关闭,下一次也一定是登录操作
所以一次登录时间长度为本次登录时间--下次登录前一条记录的时间
但是如果用户非正常关闭后没在登录就需要单独处理,比如sessionid20分钟没操作就过期,就查看最后一条记录距离当前是否超过20分钟,超过就认为已经非正常退出。
反正得有用户标示,去判断是哪个用户的行为日志,
写日志的时候再写上每次登陆登出的时间差到日志,最后相加?
表可以这样设计
登录的时候,session中记录登录时间,同时把退出时间设置为:登录时间+超时时间。
用户活动的时候,根据session中记录的登录时间,去更新那条记录的退出时间为:当前时间+超时时间。
退出的时候,根据session中记录的登录时间,去更新那条记录的退出时间为:当前时间。
原始表(假设):
最终生成的表:
具体流程:
提供下思路哈,具体实现起来个人觉得很不容易(逻辑处理需用到php,分页的时候也较麻烦,得按照日期进行分页显示,而不能像
limit 1 , 10
这样按取出的记录数进行分页 ,单sql无法得出最终表结构),所以,就只能到这儿了....借问题请教一下大家哈? 登陆可以记录,登出怎么记录呢? 用户不一定真的就点登出按钮啊。如果是web的话,用户可以直接关闭浏览器就不关了,怎么知道什么时候登出的呢? session吗?