如何解决用户在线登陆时间——的小时和分钟计算问题

小大飞 2013-10-13 08:19:24
我想得到用户在线时长,格式是:08:00和08:43这种格式的在线时长结果。

我自己尝试查了sql的文档,也百度了很多。但是没有这方面的应用。
我自己也尝试写了很多但是不行。
我只能得到在线的总分钟数,或者总秒数。无法弄成想要的格式。
这是我的代码:
select ta.[user],(DATEDIFF(mi,ta.time,tb.time)) from
(select * from T1 where T1.operate='Login') as ta
inner join
(select * from T1 where T1.operate='Logout') as tb

on ta.[user]=tb.[user]

------------------------------------
或者这样写:

select ta.[user], cast(datediff(hour, ta.time, tb.time) as varchar) + ':' + cast(DATEDIFF(MINUTE, ta.time, tb.time) as varchar)
from
(select [user], [time] from T1 where [operate] = 'login') as ta
inner join
(select [user], [time] from T1 where [operate] = 'logout') as tb
on ta.[user] = tb.[user];

两种写法都无法实现想要的结果。请求大神指导下,帮忙给出一种解决方法。我测试完,发效果图。
...全文
366 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
引用 13 楼 tong386166552 的回复:
[quote=引用 6 楼 yupeigu 的回复:] [quote=引用 3 楼 tong386166552 的回复:] [quote=引用 2 楼 shoppo0505 的回复:] 直接两个时间想减,然后舍去年份呢就行.
嗯,是不行的,我用了datediff,sql只给了返回hh 或者mi 或者day所以我可以返回总的分钟数。 或者返回总的秒数。但是我无法将时间转成小时加分钟的格式。如07:30七小时三十分钟等。 只这样不行。[/quote] 这个是你要的不:

drop table t1

create table T1
(
[user] varchar(30),
operate varchar(10),
time datetime
)

insert into T1
select 'LiMing','Login','2010/10/24 8:03' union all
select 'WangYi','Login','2010/10/24 8:14' union all
select 'WangYi','Logout','2010/10/24 16:14' union all
select 'LiMing','Logout','2010/10/24 16:14' 


select [user],
       cast(cast(round(interval * 1.0 / 60,0,1) as int) as varchar) + ':' +
       case when interval * 1.0 % 60 <> 0
                 then cast(cast(round(interval * 1.0 % 60,0,1) as int) as varchar)
            else '00'
       end
from
(
select T1.[user],
       DATEDIFF(MINUTE,t1.time,t2.time)  as interval 

from T1
inner join T1 t2
        on t1.[user] = t2.[user]
           and t1.operate = 'login'
           and t2.operate = 'logout'
)a
/*
user	(无列名)
LiMing	8:11
WangYi	8:00
*/
[/quote] 哥哥,你太强大了,经过测试,两种方法答案都对![/quote] 能帮到你就好啊
小大飞 2013-10-13
  • 打赏
  • 举报
回复
引用 6 楼 yupeigu 的回复:
[quote=引用 3 楼 tong386166552 的回复:] [quote=引用 2 楼 shoppo0505 的回复:] 直接两个时间想减,然后舍去年份呢就行.
嗯,是不行的,我用了datediff,sql只给了返回hh 或者mi 或者day所以我可以返回总的分钟数。 或者返回总的秒数。但是我无法将时间转成小时加分钟的格式。如07:30七小时三十分钟等。 只这样不行。[/quote] 这个是你要的不:

drop table t1

create table T1
(
[user] varchar(30),
operate varchar(10),
time datetime
)

insert into T1
select 'LiMing','Login','2010/10/24 8:03' union all
select 'WangYi','Login','2010/10/24 8:14' union all
select 'WangYi','Logout','2010/10/24 16:14' union all
select 'LiMing','Logout','2010/10/24 16:14' 


select [user],
       cast(cast(round(interval * 1.0 / 60,0,1) as int) as varchar) + ':' +
       case when interval * 1.0 % 60 <> 0
                 then cast(cast(round(interval * 1.0 % 60,0,1) as int) as varchar)
            else '00'
       end
from
(
select T1.[user],
       DATEDIFF(MINUTE,t1.time,t2.time)  as interval 

from T1
inner join T1 t2
        on t1.[user] = t2.[user]
           and t1.operate = 'login'
           and t2.operate = 'logout'
)a
/*
user	(无列名)
LiMing	8:11
WangYi	8:00
*/
[/quote] 哥哥,你太强大了,经过测试,两种方法答案都对!
小大飞 2013-10-13
  • 打赏
  • 举报
回复
引用 10 楼 yupeigu 的回复:
另一种方法:

--方法2.
select [user],
       convert(varchar(5),DATEADD(MINUTE,interval,time),114)
from
(
select T1.[user],
       convert(varchar(10),t1.time,120) as time,
       DATEDIFF(MINUTE,t1.time,t2.time)  as interval 

from T1
inner join T1 t2
        on t1.[user] = t2.[user]
           and t1.operate = 'login'
           and t2.operate = 'logout'
)a
/*
user	(无列名)
LiMing	08:11
WangYi	08:00
*/
ok,thank you !
小大飞 2013-10-13
  • 打赏
  • 举报
回复
引用 7 楼 stublue 的回复:

select cast( DATEDIFF(MINUTE,'2010-10-24 8:13','2010-10-24 16:14') /60 as varchar(2))
+':'+cast (  DATEDIFF(MINUTE,'2010-10-24 8:13','2010-10-24 16:14')%60 as varchar(2))
try this
不是太对。 不过还是万分感谢!
  • 打赏
  • 举报
回复
另一种方法:

--方法2.
select [user],
       convert(varchar(5),DATEADD(MINUTE,interval,time),114)
from
(
select T1.[user],
       convert(varchar(10),t1.time,120) as time,
       DATEDIFF(MINUTE,t1.time,t2.time)  as interval 

from T1
inner join T1 t2
        on t1.[user] = t2.[user]
           and t1.operate = 'login'
           and t2.operate = 'logout'
)a
/*
user	(无列名)
LiMing	08:11
WangYi	08:00
*/
小大飞 2013-10-13
  • 打赏
  • 举报
回复
User -------------------- ------------------------------ LiMing 08:41:00 WangYi 08:00:00 (2 行受影响) 这是效果。thank you!
小大飞 2013-10-13
  • 打赏
  • 举报
回复
SELECT ta.[User], CONVERT(varchar, DATEADD(s, DATEDIFF(s,ta.[time],tb.time), 0), 108)
From 
   (select [user], [time] from T1 where [operate] = 'login') as ta
inner join
   (select [user], [time] from T1 where [operate] = 'logout') as tb
on ta.[user] = tb.[user]
经过测试
引用 5 楼 no200830740203 的回复:

SELECT ta.UserName, CONVERT(varchar, DATEADD(s, DATEDIFF(s,ta.timee,tb.time), 0), 108)
From 
(select [user], [time] from T1 where [operate] = 'login') as ta
inner join
(select [user], [time] from T1 where [operate] = 'logout') as tb
on ta.[user] = tb.[user]
将时间差转为秒数计算,然后通过格式化这样应该能得出 HH:mm:ss 格式,然后考虑怎么去掉秒数ss就可以了
经过我的测试可以了,果然是大神啊! 有秒没有关系。 哈哈!万分感谢!
Leon_He2014 2013-10-13
  • 打赏
  • 举报
回复

select cast( DATEDIFF(MINUTE,'2010-10-24 8:13','2010-10-24 16:14') /60 as varchar(2))
+':'+cast (  DATEDIFF(MINUTE,'2010-10-24 8:13','2010-10-24 16:14')%60 as varchar(2))
try this
  • 打赏
  • 举报
回复
引用 3 楼 tong386166552 的回复:
[quote=引用 2 楼 shoppo0505 的回复:] 直接两个时间想减,然后舍去年份呢就行.
嗯,是不行的,我用了datediff,sql只给了返回hh 或者mi 或者day所以我可以返回总的分钟数。 或者返回总的秒数。但是我无法将时间转成小时加分钟的格式。如07:30七小时三十分钟等。 只这样不行。[/quote] 这个是你要的不:

drop table t1

create table T1
(
[user] varchar(30),
operate varchar(10),
time datetime
)

insert into T1
select 'LiMing','Login','2010/10/24 8:03' union all
select 'WangYi','Login','2010/10/24 8:14' union all
select 'WangYi','Logout','2010/10/24 16:14' union all
select 'LiMing','Logout','2010/10/24 16:14' 


select [user],
       cast(cast(round(interval * 1.0 / 60,0,1) as int) as varchar) + ':' +
       case when interval * 1.0 % 60 <> 0
                 then cast(cast(round(interval * 1.0 % 60,0,1) as int) as varchar)
            else '00'
       end
from
(
select T1.[user],
       DATEDIFF(MINUTE,t1.time,t2.time)  as interval 

from T1
inner join T1 t2
        on t1.[user] = t2.[user]
           and t1.operate = 'login'
           and t2.operate = 'logout'
)a
/*
user	(无列名)
LiMing	8:11
WangYi	8:00
*/
  • 打赏
  • 举报
回复

SELECT ta.UserName, CONVERT(varchar, DATEADD(s, DATEDIFF(s,ta.timee,tb.time), 0), 108)
From 
(select [user], [time] from T1 where [operate] = 'login') as ta
inner join
(select [user], [time] from T1 where [operate] = 'logout') as tb
on ta.[user] = tb.[user]
将时间差转为秒数计算,然后通过格式化这样应该能得出 HH:mm:ss 格式,然后考虑怎么去掉秒数ss就可以了
小大飞 2013-10-13
  • 打赏
  • 举报
回复
大神都去哪里了?
小大飞 2013-10-13
  • 打赏
  • 举报
回复
引用 2 楼 shoppo0505 的回复:
直接两个时间想减,然后舍去年份呢就行.
嗯,是不行的,我用了datediff,sql只给了返回hh 或者mi 或者day所以我可以返回总的分钟数。 或者返回总的秒数。但是我无法将时间转成小时加分钟的格式。如07:30七小时三十分钟等。 只这样不行。
shoppo0505 2013-10-13
  • 打赏
  • 举报
回复
直接两个时间想减,然后舍去年份呢就行.
小大飞 2013-10-13
  • 打赏
  • 举报
回复
嗯,题目结果的答案是错误的,但是格式是正确的。我想要的是那种格式的结果。谢谢。

22,207

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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