实现内容的时间交集计算的sql语句

sql语句可以实现大量我们需要的功能,下面介绍的sql语句可以实现内容的时间交集计算,希望对您有所启迪。

成都创新互联公司主要从事网站设计、成都网站制作、网页设计、企业做网站、公司建网站等业务。立足成都服务江阴,10年网站建设经验,价格优惠、服务专业,欢迎来电咨询建站服务:13518219792

如果在系统中有一张IM的登录记录表,里面是员工IM的登录时间,有登录时间,离线时间,***活动时间。

因为员工上半时有可能会同时登录多个IM,其中的时间会有交集,因为要计算员工每天IM在线的工作时间,交集时间需要过滤掉。

直接在sql server中就可以比较方便的计算出相关内容。具体的直接上sql语句代码:

 
 
 
  1. --方便演示,定义一个Source的表变量,BeginTime是登录时间,EndTime是离线时间
  2. declare @Source table(ID INT IDENTITY(1,1),BeginTime datetime, EndTime datetime)
  3. --定义输出结果表变量
  4. declare @Result table(id INT IDENTITY(1,1),BeginTime datetime, EndTime DATETIME,OnlineTime INT NULL)
  5. --插入演示数据
  6. insert into @Source values('2010-08-16 08:00:00','2010-08-16 08:40:00')
  7. insert into @Source values('2010-08-16 09:00:00','2010-08-16 11:30:00')
  8. insert into @Source values('2010-08-16 09:01:00','2010-08-16 11:32:00')
  9. insert into @Source values('2010-08-16 10:01:00','2010-08-16 12:01:00')
  10. insert into @Source values('2010-08-16 11:00:00','2010-08-16 12:05:00')
  11. insert into @Source values('2010-08-16 12:10:00','2010-08-16 13:40:00')
  12. insert into @Source values('2010-08-16 13:10:00','2010-08-16 14:15:00')
  13. insert into @Source values('2010-08-16 14:00:00','2010-08-16 16:32:00')
  14. insert into @Source values('2010-08-16 07:20:00','2010-08-16 16:40:00')
  15. insert into @Source values('2010-08-16 17:00:00','2010-08-16 20:32:00')
  16. insert into @Source values('2010-08-16 07:00:00','2010-08-16 07:18:00')
  17. insert into @Source values('2010-08-16 07:30:00','2010-08-16 08:20:00')
  18. --模拟数据库中的数据,插入一些其他时间的数据
  19. insert into @Source values('2010-08-15 08:00:00','2010-08-16 08:40:00')
  20. insert into @Source values('2010-08-17 09:00:00','2010-08-16 11:30:00')
  21. insert into @Source values('2010-08-14 09:01:00','2010-08-16 11:32:00')
  22. insert into @Source values('2010-08-13 10:01:00','2010-08-16 12:01:00')
  23. insert into @Source values('2010-08-17 11:00:00','2010-08-16 12:05:00')
  24. insert into @Source values('2010-08-17 12:10:00','2010-08-16 13:40:00')
  25. insert into @Source values('2010-08-17 13:10:00','2010-08-16 14:15:00')
  26. insert into @Source values('2010-08-17 14:00:00','2010-08-16 16:32:00')
  27. insert into @Source values('2010-08-15 07:20:00','2010-08-16 16:40:00')
  28. insert into @Source values('2010-08-13 17:00:00','2010-08-16 20:32:00')
  29. insert into @Source values('2010-08-12 07:00:00','2010-08-16 07:18:00')
  30. insert into @Source values('2010-08-11 07:30:00','2010-08-16 08:20:00')
  31. --定义需要用到的变量
  32. DECLARE @count INT,@ID INT,@begintime DATETIME,@endtime DATETIME,@Date DATE
  33. --如果需要指定计算的日期,可以设置日期值,否则为null会计算全部的时间
  34. SET @Date = '2010-08-16 07:30:00'
  35. --如果日期不为空,则清除Source中的垃圾数据
  36. IF @Date IS NOT NULL
  37. BEGIN
  38.     DELETE FROM @Source WHERE BeginTime < @Date OR BeginTime >= DATEADD(DAY,1,@Date)
  39. END
  40. --计算Count,以便进行遍历
  41. SELECT @count = COUNT(1) FROM @Source
  42. --遍历Source中的数据
  43. WHILE @count > 0
  44. BEGIN
  45.     
  46.     --根据时间排序,每次取1条数据
  47.     SELECT TOP 1 @begintime = BeginTime,@endtime = EndTime ,@IDID = ID FROM @Source
  48.     ORDER BY BeginTime
  49.     
  50.     --如果Result中没有记录,则直接插入,否则进行判断
  51.     IF NOT EXISTS(SELECT 1 FROM @Result)
  52.     BEGIN
  53.         insert into @Result values(@begintime,@endtime,NULL);
  54.     END
  55.     ELSE
  56.     BEGIN
  57.         --由于Source的数据是经过排序的,所以下面的插入已经无效,直接注释掉
  58.         --IF NOT EXISTS(SELECT 1 FROM @Result WHERE BeginTime < @endtime AND EndTime < @begintime)
  59.         --BEGIN
  60.         --    insert into @Result values(@begintime,@endtime,NULL);
  61.         --END
  62.         
  63.         --如果开始时间大于Result中的已存在的记录结束时间,则直接插入数据
  64.         IF NOT EXISTS(SELECT 1 FROM @Result WHERE EndTime > @begintime)
  65.         BEGIN
  66.             insert into @Result values(@begintime,@endtime,NULL);
  67.         END
  68.         --判断Result中的数据开始时间是否大于Source中的开始时间,大于则更新
  69.         ELSE IF EXISTS(SELECT 1 FROM @Result WHERE BeginTime > @begintime AND EndTime < @endtime AND EndTime > @endtime)
  70.         BEGIN
  71.             UPDATE @Result SET BeginTime = @begintime WHERE BeginTime > @begintime AND BeginTime < @endtime AND EndTime > @endtime
  72.         END
  73.         --判断Result中的数据结束时间是否小于Source中的结束时间,小于则更新
  74.         ELSE IF EXISTS(SELECT 1 FROM @Result WHERE BeginTime < @begintime AND BeginTime < @endtime AND EndTime < @endtime AND EndTime > @begintime)
  75.         BEGIN
  76.             UPDATE @Result SET EndTime = @endtime WHERE BeginTime < @begintime AND BeginTime < @endtime AND EndTime < @endtime AND EndTime > @begintime
  77.         END
  78.         --判断Result中的记录时间是否被Source中的时间被包含,包含则开始与结束都更新
  79.         ELSE IF EXISTS(SELECT 1 FROM @Result WHERE BeginTime > @begintime AND BeginTime < @endtime AND EndTime < @endtime AND EndTime > @begintime)
  80.         BEGIN
  81.             SELECT * FROM @Result WHERE BeginTime > @begintime AND BeginTime < @endtime AND EndTime < @endtime AND EndTime > @begintime
  82.             UPDATE @Result SET BeginTime = @begintime, EndTime = @endtime WHERE BeginTime > @begintime AND BeginTime < @endtime AND EndTime < @endtime AND EndTime > @begintime
  83.         END
  84.     END
  85.     
  86.     --删除已经读取过的记录
  87.     DELETE FROM @Source WHERE id = @ID
  88.     --更新Count
  89.     SELECT @count = COUNT(1) FROM @Source
  90. END
  91. --计算OnlineTime
  92. UPDATE @Result SET OnlineTime = DATEDIFF(mi,BeginTime,EndTime)
  93. --显示结果
  94. SELECT * FROM @Result

文章标题:实现内容的时间交集计算的sql语句
网址分享:http://www.shufengxianlan.com/qtweb/news42/511192.html

网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联