在论坛中出现的比较难的sql问题:45(用户在线登陆时间的小时、分钟计算问题)

原文: 在论坛中出现的比较难的sql问题:45(用户在线登陆时间的小时、分钟计算问题)

最近,在论坛中,遇到了不少比较难的sql问题,虽然自己都能解决,但发现过几天后,就记不起来了,也忘记解决的方法了。

所以,觉得有必要记录下来,这样以后再次碰到这类问题,也能从中获取解答的思路。



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

http://bbs.csdn.net/topics/390613823

我想得到用户在线时长,格式是: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];

两种写法都无法实现想要的结果。请求大神指导下,帮忙给出一种解决方法。
我测试完,发效果图。

我的解法:

方法1:


   
   
  1. drop table t1
  2. create table T1
  3. (
  4. [ user] varchar( 30),
  5. operate varchar( 10),
  6. time datetime
  7. )
  8. insert into T1
  9. select 'LiMing', 'Login', '2010/10/24 8:03' union all
  10. select 'WangYi', 'Login', '2010/10/24 8:14' union all
  11. select 'WangYi', 'Logout', '2010/10/24 16:14' union all
  12. select 'LiMing', 'Logout', '2010/10/24 16:14'
  13. select [ user],
  14. cast( cast( round( interval * 1.0 / 60, 0, 1) as int) as varchar) + ':' +
  15. case when interval * 1.0 % 60 <> 0
  16. then cast( cast( round( interval * 1.0 % 60, 0, 1) as int) as varchar)
  17. else '00'
  18. end
  19. from
  20. (
  21. select T1.[ user],
  22. DATEDIFF( MINUTE,t1.time,t2.time) as interval
  23. from T1
  24. inner join T1 t2
  25. on t1.[ user] = t2.[ user]
  26. and t1.operate = 'login'
  27. and t2.operate = 'logout'
  28. )a
  29. /*
  30. user (无列名)
  31. LiMing 8:11
  32. WangYi 8:00
  33. */

方法2:


   
   
  1. --方法2.
  2. select [ user],
  3. convert( varchar( 5), DATEADD( MINUTE, interval, time), 114)
  4. from
  5. (
  6. select T1.[ user],
  7. convert( varchar( 10),t1.time, 120) as time,
  8. DATEDIFF( MINUTE,t1.time,t2.time) as interval
  9. from T1
  10. inner join T1 t2
  11. on t1.[ user] = t2.[ user]
  12. and t1.operate = 'login'
  13. and t2.operate = 'logout'
  14. )a
  15. /*
  16. user (无列名)
  17. LiMing 08:11
  18. WangYi 08:00
  19. */
最近,在论坛中,遇到了不少比较难的sql问题,虽然自己都能解决,但发现过几天后,就记不起来了,也忘记解决的方法了。

所以,觉得有必要记录下来,这样以后再次碰到这类问题,也能从中获取解答的思路。

发布了416 篇原创文章 · 获赞 135 · 访问量 95万+

猜你喜欢

转载自www.cnblogs.com/lonelyxmas/p/12020079.html