如何取得系统登录时间?
我现在的数据是这样的,userid表示用户登录系统的代码,time表示登录登出系统的时间,status,1表示登录,2表示登出;
登出的记录有可能会丢失,例如,突然断网断点之类的,登出的记录可能没有办法取到。
userid time status
user001 2011-06-10 10:00:00.000 1
user001 2011-06-10 14:57:24.000 1
user001 2011-06-10 15:03:41.000 2
user001 2011-06-10 16:50:00.000 1
user001 2011-06-10 17:03:40.000 2
user001 2011-06-10 17:20:40.000 1
user002 2011-06-10 10:01:20.000 1
user002 2011-06-10 10:20:24.000 1
user002 2011-06-10 10:40:40.000 2
user002 2011-06-10 13:50:00.000 1
user002 2011-06-10 15:03:40.000 2
我想要的结果是:
用户代码 登录时间区间
user001 2011-06-10 10:00:00.000-- null 0 minutes
user001 2011-06-10 14:57:24.000--2011-06-10 15:03:41.000 6 minutes
user001 2011-06-10 16:50:00.000--2011-06-10 17:03:40.000 13 minutes
user001 2011-06-10 17:20:40.000 null 0 minutes
user002 2011-06-10 10:01:20.000--null 0 minutes
user002 2011-06-10 10:20:24.000-- 2011-06-10 10:40:40.000 20 minutes
user002 2011-06-10 13:50:00.000--2011-06-10 15:03:40.000 73minutes
我的目的是统计每个用户登录系统的时间的汇总。
登出的记录有可能会丢失,例如,突然断网断点之类的,登出的记录可能没有办法取到。
userid time status
user001 2011-06-10 10:00:00.000 1
user001 2011-06-10 14:57:24.000 1
user001 2011-06-10 15:03:41.000 2
user001 2011-06-10 16:50:00.000 1
user001 2011-06-10 17:03:40.000 2
user001 2011-06-10 17:20:40.000 1
user002 2011-06-10 10:01:20.000 1
user002 2011-06-10 10:20:24.000 1
user002 2011-06-10 10:40:40.000 2
user002 2011-06-10 13:50:00.000 1
user002 2011-06-10 15:03:40.000 2
我想要的结果是:
用户代码 登录时间区间
user001 2011-06-10 10:00:00.000-- null 0 minutes
user001 2011-06-10 14:57:24.000--2011-06-10 15:03:41.000 6 minutes
user001 2011-06-10 16:50:00.000--2011-06-10 17:03:40.000 13 minutes
user001 2011-06-10 17:20:40.000 null 0 minutes
user002 2011-06-10 10:01:20.000--null 0 minutes
user002 2011-06-10 10:20:24.000-- 2011-06-10 10:40:40.000 20 minutes
user002 2011-06-10 13:50:00.000--2011-06-10 15:03:40.000 73minutes
我的目的是统计每个用户登录系统的时间的汇总。
作者: michelle_weimei 发布时间: 2011-06-15
SQL code
create table tb(userid varchar(10),time datetime,status int) insert into tb select 'user001','2011-06-10 10:00:00.000',1 insert into tb select 'user001','2011-06-10 14:57:24.000',1 insert into tb select 'user001','2011-06-10 15:03:41.000',2 insert into tb select 'user001','2011-06-10 16:50:00.000',1 insert into tb select 'user001','2011-06-10 17:03:40.000',2 insert into tb select 'user001','2011-06-10 17:20:40.000',1 insert into tb select 'user002','2011-06-10 10:01:20.000',1 insert into tb select 'user002','2011-06-10 10:20:24.000',1 insert into tb select 'user002','2011-06-10 10:40:40.000',2 insert into tb select 'user002','2011-06-10 13:50:00.000',1 insert into tb select 'user002','2011-06-10 15:03:40.000',2 go ;with cte as( select row_number()over(order by userid,time)rn,* from tb )select a.userid,a.time,b.time,datediff(mi,a.time,b.time) from cte a left join cte b on a.userid=b.userid and a.status=1 and b.status=2 and a.rn=b.rn-1 /* userid time time ---------- ----------------------- ----------------------- ----------- user001 2011-06-10 10:00:00.000 NULL NULL user001 2011-06-10 14:57:24.000 2011-06-10 15:03:41.000 6 user001 2011-06-10 15:03:41.000 NULL NULL user001 2011-06-10 16:50:00.000 2011-06-10 17:03:40.000 13 user001 2011-06-10 17:03:40.000 NULL NULL user001 2011-06-10 17:20:40.000 NULL NULL user002 2011-06-10 10:01:20.000 NULL NULL user002 2011-06-10 10:20:24.000 2011-06-10 10:40:40.000 20 user002 2011-06-10 10:40:40.000 NULL NULL user002 2011-06-10 13:50:00.000 2011-06-10 15:03:40.000 73 user002 2011-06-10 15:03:40.000 NULL NULL (11 行受影响) */ go drop table tb
作者: qianjin036a 发布时间: 2011-06-15
SQL code
create table tb(userid varchar(10),time datetime,status int) insert into tb select 'user001','2011-06-10 10:00:00.000',1 insert into tb select 'user001','2011-06-10 14:57:24.000',1 insert into tb select 'user001','2011-06-10 15:03:41.000',2 insert into tb select 'user001','2011-06-10 16:50:00.000',1 insert into tb select 'user001','2011-06-10 17:03:40.000',2 insert into tb select 'user001','2011-06-10 17:20:40.000',1 insert into tb select 'user002','2011-06-10 10:01:20.000',1 insert into tb select 'user002','2011-06-10 10:20:24.000',1 insert into tb select 'user002','2011-06-10 10:40:40.000',2 insert into tb select 'user002','2011-06-10 13:50:00.000',1 insert into tb select 'user002','2011-06-10 15:03:40.000',2 go ;with cte as( select row_number()over(order by userid,time)rn,* from tb )select a.userid,a.time,b.time,isnull(datediff(mi,a.time,b.time),0) as n,'minuters'as unit from cte a left join cte b on a.userid=b.userid and a.status=1 and b.status=2 and a.rn=b.rn-1 /* userid time time n unit ---------- ----------------------- ----------------------- ----------- -------- user001 2011-06-10 10:00:00.000 NULL 0 minuters user001 2011-06-10 14:57:24.000 2011-06-10 15:03:41.000 6 minuters user001 2011-06-10 15:03:41.000 NULL 0 minuters user001 2011-06-10 16:50:00.000 2011-06-10 17:03:40.000 13 minuters user001 2011-06-10 17:03:40.000 NULL 0 minuters user001 2011-06-10 17:20:40.000 NULL 0 minuters user002 2011-06-10 10:01:20.000 NULL 0 minuters user002 2011-06-10 10:20:24.000 2011-06-10 10:40:40.000 20 minuters user002 2011-06-10 10:40:40.000 NULL 0 minuters user002 2011-06-10 13:50:00.000 2011-06-10 15:03:40.000 73 minuters user002 2011-06-10 15:03:40.000 NULL 0 minuters (11 行受影响) */ go drop table tb
作者: qianjin036a 发布时间: 2011-06-15
SQL code
create table tb(userid varchar(10),time datetime,status int) insert into tb select 'user001','2011-06-10 10:00:00.000',1 insert into tb select 'user001','2011-06-10 14:57:24.000',1 insert into tb select 'user001','2011-06-10 15:03:41.000',2 insert into tb select 'user001','2011-06-10 16:50:00.000',1 insert into tb select 'user001','2011-06-10 17:03:40.000',2 insert into tb select 'user001','2011-06-10 17:20:40.000',1 insert into tb select 'user002','2011-06-10 10:01:20.000',1 insert into tb select 'user002','2011-06-10 10:20:24.000',1 insert into tb select 'user002','2011-06-10 10:40:40.000',2 insert into tb select 'user002','2011-06-10 13:50:00.000',1 insert into tb select 'user002','2011-06-10 15:03:40.000',2 go ;with cte as( select row_number()over(order by userid,time)rn,* from tb )select a.userid,a.time,b.time,isnull(datediff(mi,a.time,b.time),0) as n,'minuters'as unit from cte a left join cte b on a.userid=b.userid and a.rn=b.rn-1 and b.status=2 where a.status=1 /* userid time time n unit ---------- ----------------------- ----------------------- ----------- -------- user001 2011-06-10 10:00:00.000 NULL 0 minuters user001 2011-06-10 14:57:24.000 2011-06-10 15:03:41.000 6 minuters user001 2011-06-10 16:50:00.000 2011-06-10 17:03:40.000 13 minuters user001 2011-06-10 17:20:40.000 NULL 0 minuters user002 2011-06-10 10:01:20.000 NULL 0 minuters user002 2011-06-10 10:20:24.000 2011-06-10 10:40:40.000 20 minuters user002 2011-06-10 13:50:00.000 2011-06-10 15:03:40.000 73 minuters (7 行受影响) */ go drop table tb
作者: qianjin036a 发布时间: 2011-06-15
SQL code
WITH BTS AS ( SELECT *,ROW_NUMBER() OVER (PARTITION BY userid ORDER BY time) RM FROM 表名 ), BS AS ( SELECT *,(SELECT time FROM BTS WHERE userid=A.userid AND status=2 AND RM=A.RM+1) OUTTime FROM BTS A WHERE status=1 ) SELECT *,ISNULL(DATEDIFF(Mi,time,OUTTime),0) FROM BS
作者: zs621 发布时间: 2011-06-15
mark 不错
作者: sekai2011 发布时间: 2011-06-15
引用 3 楼 qianjin036a 的回复:
SQL code
create table tb(userid varchar(10),time datetime,status int)
insert into tb select 'user001','2011-06-10 10:00:00.000',1
insert into tb select 'user001','2011-06-10 14:57:24.000',1
insert……
SQL code
create table tb(userid varchar(10),time datetime,status int)
insert into tb select 'user001','2011-06-10 10:00:00.000',1
insert into tb select 'user001','2011-06-10 14:57:24.000',1
insert……
+
作者: yubofighting 发布时间: 2011-06-15