在线时间统计

MJJ_Hua 2006-06-25 04:09:25
表TABLE1 结构如下:
users time flag
A君 2006-6-24 8:14:06 0
B君 2006-6-24 8:14:06 0
A君 2006-6-24 9:22:52 1
C君 2006-6-24 7:13:23 0
A君 2006-6-24 10:25:03 0
C君 2006-6-24 9:28:32 1
A君 2006-6-24 11:46:27 1

flag 为0 表示用户登入时间, 为1表示用户登出时间. 现在要求算出每个人的在线总时间. 表的结构是定死的. 不能动了, 请教如何写存储过程?
...全文
525 12 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
MJJ_Hua 2006-06-25
  • 打赏
  • 举报
回复
多谢各位指教. 散分.
LouisXIV 2006-06-25
  • 打赏
  • 举报
回复
以秒为统计单位,如超过24小时需要改动一下写法
LouisXIV 2006-06-25
  • 打赏
  • 举报
回复
if object_id('Table1') is not null drop table table1
go
create table table1
(
users varchar(10),
time datetime,
flag bit
)
go
insert into table1
select 'A君','2006-6-24 8:14:06',0 union all
select 'B君','2006-6-24 8:14:06',0 union all
select 'A君','2006-6-24 9:22:52',1 union all
select 'C君','2006-6-24 7:13:23',0 union all
select 'A君','2006-6-24 10:25:03',0 union all
select 'C君','2006-6-24 9:28:32',1 union all
select 'A君','2006-6-24 11:46:27',1
go
select * from table1
go
select id=identity(int,1,1),users,time,flag into # from (select top 100 percent * from table1 order by time)aa
go
select * from #
go

select users,convert(varchar(10),dateadd(second,sum(logintime),0),108)as LoginTime
from
(
select
users,
logintime=(select datediff(second,time,a.time) from # where flag=0 and users=a.users and id=(select max(id) from # where id<a.id and users=a.users))
from # a
where flag=1
)aa
group by users

go
drop table #,table1
go


/*
id users time flag
----------- ---------- ------------------------------------------------------ ----
1 C君 2006-06-24 07:13:23.000 0
2 A君 2006-06-24 08:14:06.000 0
3 B君 2006-06-24 08:14:06.000 0
4 A君 2006-06-24 09:22:52.000 1
5 C君 2006-06-24 09:28:32.000 1
6 A君 2006-06-24 10:25:03.000 0
7 A君 2006-06-24 11:46:27.000 1

users LoginTime
---------- ----------
A君 02:30:10
C君 02:15:09
*/

--测试数据中B没有登出记录,不做统计
--如有连续登入而只有一次登出,一最后一次登入和登出之间的时间差为准
zlp321002 2006-06-25
  • 打赏
  • 举报
回复
--如果按每天统计一次,用户登录信息.要加个条件,如下:

declare @t table(users varchar(20),time datetime,flag int)
insert into @t select 'A君','2006-6-24 8:14:06',0
union all select 'B君','2006-6-24 8:14:06',0
union all select 'A君','2006-6-24 9:22:52',1
union all select 'C君','2006-6-24 7:13:23',0
union all select 'A君','2006-6-24 10:25:03',0
union all select 'C君','2006-6-24 9:28:32',1
union all select 'A君','2006-6-24 11:46:27',1
union all select 'C君','2006-6-25 7:13:23',0
union all select 'A君','2006-6-25 10:25:03',0
union all select 'C君','2006-6-25 9:28:32',1
union all select 'A君','2006-6-25 11:46:27',1



SELECT users,LoginTime=MAX(LoginTime),LogoutTime=MAX(LogoutTime)
FROM
(
SELECT users,LoginTime=MIN(CASE WHEN FLAG=0 THEN TIME END),
LogoutTime=MAX(CASE WHEN FLAG=1 THEN TIME END),
flag,
times=convert(varchar(10),TIME,120)
FROM @t
GROUP BY users,FLAG,convert(varchar(10),TIME,120)
)T
GROUP BY USERS,times
ORDER BY USERS


/*
A君 2006-06-24 08:14:06.000 2006-06-24 11:46:27.000
A君 2006-06-25 10:25:03.000 2006-06-25 11:46:27.000
B君 2006-06-24 08:14:06.000 NULL
C君 2006-06-24 07:13:23.000 2006-06-24 09:28:32.000
C君 2006-06-25 07:13:23.000 2006-06-25 09:28:32.000

*/

LouisXIV 2006-06-25
  • 打赏
  • 举报
回复
记录登陆时间的文件一般都存在不正常登出记录

你是不是考虑连续2,3次登入而只有1次登出的记录?
zlp321002 2006-06-25
  • 打赏
  • 举报
回复
declare @t table(users varchar(20),time datetime,flag int)
insert into @t select 'A君','2006-6-24 8:14:06',0
union all select 'B君','2006-6-24 8:14:06',0
union all select 'A君','2006-6-24 9:22:52',1
union all select 'C君','2006-6-24 7:13:23',0
union all select 'A君','2006-6-24 10:25:03',0
union all select 'C君','2006-6-24 9:28:32',1
union all select 'A君','2006-6-24 11:46:27',1


SELECT users,LoginTime=MAX(LoginTime),LogoutTime=MAX(LogoutTime)
FROM
(
SELECT users,LoginTime=MIN(CASE WHEN FLAG=0 THEN TIME END),
LogoutTime=MAX(CASE WHEN FLAG=1 THEN TIME END),
flag
FROM @t
GROUP BY users,FLAG
)T
GROUP BY USERS
ORDER BY USERS

/*
A君 2006-06-24 08:14:06.000 2006-06-24 11:46:27.000
B君 2006-06-24 08:14:06.000 NULL
C君 2006-06-24 07:13:23.000 2006-06-24 09:28:32.000
*/
mschen 2006-06-25
  • 打赏
  • 举报
回复
-- 这样可以对上边的结果对Users分组,sum(DiffTime)就可以得到总的时间了

-- 如果你的表非常大的话,最好在Users,和Time字段上建立符合索引

create index idx_users_time on #t(users,[time])
liangpei2008 2006-06-25
  • 打赏
  • 举报
回复
--刚才写的是以小时为单位,改为分钟更合理!
select users,
时间=sum(case flag when 0 then datediff(mi,time,getdate()) else -datediff(mi,time,getdate()) end)
from @t
group by users
mschen 2006-06-25
  • 打赏
  • 举报
回复
-- 测试表,测试数据
create table #t(users varchar(10),[time] datetime,flag bit)
Go
insert #t select 'A君','2006-6-24 8:14:06',0
insert #t select 'B君','2006-6-24 8:14:06',0
insert #t select 'A君','2006-6-24 9:22:52',1
insert #t select 'c君','2006-6-24 7:13:23',0
insert #t select 'A君','2006-6-24 10:25:03',0
insert #t select 'C君','2006-6-24 9:28:32',1
insert #t select 'A君','2006-6-24 11:46:27',1
Go
-- 查询语句
select users,
[time] as LoginTime,
isnull((select top 1 [time]
from #t
where users=a.users and [time]>a.[time] and flag=1
order by [time]),getdate()) as LogoutTime,
datediff(mi,[time],isnull((select top 1 [time]
from #t
where users=a.users and [time]>a.[time] and flag=1
order by [time]),getdate())) as DiffTime
from #t a

where flag=0
-- 结果

users LoginTime LogoutTime DiffTime
---------- ------------------------------------------------------ ------------------------------------------------------ -----------
A君 2006-06-24 08:14:06.000 2006-06-24 09:22:52.000 68
B君 2006-06-24 08:14:06.000 2006-06-25 16:24:25.340 1930
c君 2006-06-24 07:13:23.000 2006-06-24 09:28:32.000 135
A君 2006-06-24 10:25:03.000 2006-06-24 11:46:27.000 81

(所影响的行数为 4 行)
liangpei2008 2006-06-25
  • 打赏
  • 举报
回复
--这样?
declare @t table(users varchar(10),time datetime,flag int)
insert @t select 'A','2006-6-24 8:14:06',0
union all select 'B','2006-6-24 8:14:06',0
union all select 'A','2006-6-24 9:22:52',1
union all select 'C','2006-6-24 7:13:23',0
union all select 'A','2006-6-24 10:25:03',0
union all select 'C','2006-6-24 9:28:32',1
union all select 'A','2006-6-24 11:46:27 ',1

select users,
时间=sum(case flag when 0 then datediff(hh,time,getdate()) else -datediff(hh,time,getdate()) end)
from @t
group by users
MJJ_Hua 2006-06-25
  • 打赏
  • 举报
回复
不正常记录?
什么叫不正常记录啊, 记录的格式都是上面那样,没有问题的.
LouisXIV 2006-06-25
  • 打赏
  • 举报
回复
是否考虑不正常记录?
演示下载: http://demo.codechina.net/vf/tsjxc.exe 总部主系统 1 功能 1.1 进货管理 1.1.1 进货单查询、录入、修改、删除、恢复。并将进货数据传至库存模块,经库存审核后自动录入库存库。 1.1.2 缺货清单查询。 1.1.3 退货(退厂)数据查询、打印。根据库存库退货出库所传来的数据自动录入。 1.1.4 统计进货数据,查看和打印统计结果。统计的项目为: 1.1.4.1 任意时段所有商品的进货、退货、保修金额合计。 1.1.4.2 任意时段某一商品的进货、退货、保修数量、金额合计。 1.1.4.3 到目前为止尚未保修返回的金额合计。 1.1.4.4 任意时段所有供应商的进货、退货、保修金额合计。 1.1.4.5 任意时段某一供应商的进货、退货、保修金额合计。 1.1.5 供应商查询、录入、修改、删除、恢复。 1.1.6 保修(保修退厂)数据查询、打印、返回核消。根据库存库保修出库所传来的数据自动审核录入。 1.2 库存管理 1.2.1 初始化库存,录入商品的初始库存数,一旦总帐中已有该商品,则不能再录入初始数。 1.2.2 进、出库数据查询、录入、修改、删除、恢复。审核及自动录入进货模块和代销模块由于进货、出货、退货及保修传来的进出库数据。打印进出库单。 1.2.3 设定商品库存下限。在库存低于下限时报警,并出具下限报警商品清单给进货模块。 1.2.4 盘点。查看、打印盘点表。录入盘盈、盘亏数据。盘亏的数据做为报费数进行统计。残次品库的盘点,盘盈、盘亏数直接在残次品库中处理。 1.2.5 (暂不使用)残次品、报费数据的输入。正品转残次品,从仓库总帐及日记帐中做出库处理,自动转到残次品库;残次品转正品,则自动从残次品库中出库转向总库,总帐及日记帐中做入库处理。 1.2.6 库存数据统计,查看、打印统计数据。统计的项目为: 1.2.6.1 统计到目前为止所有商品的数量、金额合计。 1.2.6.2 任意时段所有商品的进库、出库数量、金额合计。 1.2.6.3 任意时段某一商品的进库、出库数量、金额合计。 1.2.6.4 到目前为止残次品的库存金额合计。 1.2.6.5 任意时段所有商品的报费金额合计。 1.2.6.6 任意时段某一商品的报费数量、金额合计。 1.3 销售管理 1.3.1 记录每一笔销售数据。录入、修改、删除、恢复、查看每一笔从总部的仓库中直接销售出去的数据。并将销售数据自动传送到库存模块用于审核及自动录入。 1.3.2 退货管理。录入、修改、删除、恢复、查看有关退货的数据,并将退货数据自动传给库存模块,由库存审核后自动录入。 1.3.3 保修管理。录入、修改、删除、恢复、查看有关保修的数据,返回核消,并将保修数据自动传给库存模块,由库存审核后自动录入。 1.3.4 统计销售数据,并查看和打印统计数据,按金额排序,标记出数量最多的商品。统计的项目为: 1.3.4.1 任意时段所有商品的销售金额、合计。 1.3.4.2 任意时段某一商品的销售数量、金额合计。 1.4 代销管理 1.4.1 出货单管理。记录每一笔出货给代销商的数据。并将数据传给库存模块,经审核后自动录入。 1.4.2 结算管理。根据出货单中的金额数据记录应付款,代销商每付一笔款,即从结算款中减去相应的数额,余额继续做为应付款。 1.4.3 销售管理。录入、修改、删除、恢复代销商传来的有关销售数据,传送的方式可用纸质、磁盘、电话线。根据销售数计算并自动录入代销点的库存数。 1.4.4 退货(退仓)数据录入、修改、删除、恢复、查看。并将退货数据传给库存模块,由库存审核后自动录入。 1.4.5 保修(保修退仓)数据录入、修改、删除、恢复、查看。并将保修数据传给库存模块,由库存审核后自动录入。 1.4.6 销售统计,并查看和打印统计数据。统计的范围包括某一代销商、全部代销商、包括仓库直接销售,统计的项目为: 1.4.6.1 任意时段所有商品的销售金额、成本、利润合计。 1.4.6.2 任意时段某一商品的销售数量、金额、成本、利润合计。 1.4.6.3 任意时段销售数量、营业额、成本、利润最多、最少的商品。 1.4.6.4 到目前为止,盘点的库存数与上报销售数所推算出的库存数的差额,分别包括数量和金额。 1.4.6.5 任意时段退货金额。 1.4.6.6 任意时段保修金额,及到目前为止尚未保修返还的商品、数量、金额。 1.4.6.7 到目前为止的各代销商及总的应收款金额合计。 1.4.7 盘点。查看、打印盘点表。录入盘点库存数,但不用盘点数修正根据销售数所得的库存数,两个数据都要,并在统计中做比较,以了解代销商押总部货款的数额。 1.5 辅助功能 1.5.1 工作人员管理。 1.5.2 备份。 1.5.3 取备份。 1.5.4 密码管理。 1.5.5 整理数据。将所有数据库重新索引,稽核相关数据。 1.5.6 退出系统。 1.5.7 确认系统日期和时间。 ................... 内容详细文档

34,838

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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