实现内容的时间交集计算的sql语句
2010-10-06 18:47
351 查看
sql语句可以实现大量我们需要的功能,下面介绍的sql语句可以实现内容的时间交集计算,希望对您有所启迪。
如果在系统中有一张IM的登录记录表,里面是员工IM的登录时间,有登录时间,离线时间,最后活动时间。
因为员工上半时有可能会同时登录多个IM,其中的时间会有交集,因为要计算员工每天IM在线的工作时间,交集时间需要过滤掉。
直接在sql server中就可以比较方便的计算出相关内容。具体的直接上sql语句代码:
如果在系统中有一张IM的登录记录表,里面是员工IM的登录时间,有登录时间,离线时间,最后活动时间。
因为员工上半时有可能会同时登录多个IM,其中的时间会有交集,因为要计算员工每天IM在线的工作时间,交集时间需要过滤掉。
直接在sql server中就可以比较方便的计算出相关内容。具体的直接上sql语句代码:
--方便演示,定义一个Source的表变量,BeginTime是登录时间,EndTime是离线时间 declare @Source table(ID INT IDENTITY(1,1),BeginTime datetime, EndTime datetime) --定义输出结果表变量 declare @Result table(id INT IDENTITY(1,1),BeginTime datetime, EndTime DATETIME,OnlineTime INT NULL) --插入演示数据 insert into @Source values('2010-08-16 08:00:00','2010-08-16 08:40:00') insert into @Source values('2010-08-16 09:00:00','2010-08-16 11:30:00') insert into @Source values('2010-08-16 09:01:00','2010-08-16 11:32:00') insert into @Source values('2010-08-16 10:01:00','2010-08-16 12:01:00') insert into @Source values('2010-08-16 11:00:00','2010-08-16 12:05:00') insert into @Source values('2010-08-16 12:10:00','2010-08-16 13:40:00') insert into @Source values('2010-08-16 13:10:00','2010-08-16 14:15:00') insert into @Source values('2010-08-16 14:00:00','2010-08-16 16:32:00') insert into @Source values('2010-08-16 07:20:00','2010-08-16 16:40:00') insert into @Source values('2010-08-16 17:00:00','2010-08-16 20:32:00') insert into @Source values('2010-08-16 07:00:00','2010-08-16 07:18:00') insert into @Source values('2010-08-16 07:30:00','2010-08-16 08:20:00') --模拟数据库中的数据,插入一些其他时间的数据 insert into @Source values('2010-08-15 08:00:00','2010-08-16 08:40:00') insert into @Source values('2010-08-17 09:00:00','2010-08-16 11:30:00') insert into @Source values('2010-08-14 09:01:00','2010-08-16 11:32:00') insert into @Source values('2010-08-13 10:01:00','2010-08-16 12:01:00') insert into @Source values('2010-08-17 11:00:00','2010-08-16 12:05:00') insert into @Source values('2010-08-17 12:10:00','2010-08-16 13:40:00') insert into @Source values('2010-08-17 13:10:00','2010-08-16 14:15:00') insert into @Source values('2010-08-17 14:00:00','2010-08-16 16:32:00') insert into @Source values('2010-08-15 07:20:00','2010-08-16 16:40:00') insert into @Source values('2010-08-13 17:00:00','2010-08-16 20:32:00') insert into @Source values('2010-08-12 07:00:00','2010-08-16 07:18:00') insert into @Source values('2010-08-11 07:30:00','2010-08-16 08:20:00') --定义需要用到的变量 DECLARE @count INT,@ID INT,@begintime DATETIME,@endtime DATETIME,@Date DATE --如果需要指定计算的日期,可以设置日期值,否则为null会计算全部的时间 SET @Date = '2010-08-16 07:30:00' --如果日期不为空,则清除Source中的垃圾数据 IF @Date IS NOT NULL BEGIN DELETE FROM @Source WHERE BeginTime < @Date OR BeginTime >= DATEADD(DAY,1,@Date) END --计算Count,以便进行遍历 SELECT @count = COUNT(1) FROM @Source --遍历Source中的数据 WHILE @count > 0 BEGIN --根据时间排序,每次取1条数据 SELECT TOP 1 @begintime = BeginTime,@endtime = EndTime ,@IDID = ID FROM @Source ORDER BY BeginTime --如果Result中没有记录,则直接插入,否则进行判断 IF NOT EXISTS(SELECT 1 FROM @Result) BEGIN insert into @Result values(@begintime,@endtime,NULL); END ELSE BEGIN --由于Source的数据是经过排序的,所以下面的插入已经无效,直接注释掉 --IF NOT EXISTS(SELECT 1 FROM @Result WHERE BeginTime < @endtime AND EndTime < @begintime) --BEGIN -- insert into @Result values(@begintime,@endtime,NULL); --END --如果开始时间大于Result中的已存在的记录结束时间,则直接插入数据 IF NOT EXISTS(SELECT 1 FROM @Result WHERE EndTime > @begintime) BEGIN insert into @Result values(@begintime,@endtime,NULL); END --判断Result中的数据开始时间是否大于Source中的开始时间,大于则更新 ELSE IF EXISTS(SELECT 1 FROM @Result WHERE BeginTime > @begintime AND EndTime < @endtime AND EndTime > @endtime) BEGIN UPDATE @Result SET BeginTime = @begintime WHERE BeginTime > @begintime AND BeginTime < @endtime AND EndTime > @endtime END --判断Result中的数据结束时间是否小于Source中的结束时间,小于则更新 ELSE IF EXISTS(SELECT 1 FROM @Result WHERE BeginTime < @begintime AND BeginTime < @endtime AND EndTime < @endtime AND EndTime > @begintime) BEGIN UPDATE @Result SET EndTime = @endtime WHERE BeginTime < @begintime AND BeginTime < @endtime AND EndTime < @endtime AND EndTime > @begintime END --判断Result中的记录时间是否被Source中的时间被包含,包含则开始与结束都更新 ELSE IF EXISTS(SELECT 1 FROM @Result WHERE BeginTime > @begintime AND BeginTime < @endtime AND EndTime < @endtime AND EndTime > @begintime) BEGIN SELECT * FROM @Result WHERE BeginTime > @begintime AND BeginTime < @endtime AND EndTime < @endtime AND EndTime > @begintime UPDATE @Result SET BeginTime = @begintime, EndTime = @endtime WHERE BeginTime > @begintime AND BeginTime < @endtime AND EndTime < @endtime AND EndTime > @begintime END END --删除已经读取过的记录 DELETE FROM @Source WHERE id = @ID --更新Count SELECT @count = COUNT(1) FROM @Source END --计算OnlineTime UPDATE @Result SET OnlineTime = DATEDIFF(mi,BeginTime,EndTime) --显示结果 SELECT * FROM @Result
相关文章推荐
- 实现内容的时间交集计算的sql语句
- 时间段连续判断,实现内容的时间交集计算的sql语句
- SQL语句实现SQL Server 2000及ACCESS复制表或表结构及内容到新的表
- 计算sql语句执行时间
- SQL语句实现根据经纬度计算距离并排序分页
- SQL2000里如何计算SQL语句运行的时间
- Vertica用于时间计算的SQL语句大全
- mysql的sql语句中直接计算时间 查询昨天 一周前 一月前 一年前的数据的方法
- SQL中的时间计算语句
- 大数据IMF传奇行动绝密课程第97课:使用SparkStreaming+SparkSQL实现在线动态计算出特定时间窗口
- SQL语句执行时间的计算
- 第97课: 使用Spark Streaming+Spark SQL+mysql 实现在线动态计算出特定时间窗口下的不同种类商品中的热门商品排名(详细内幕版本)
- SQL 语句来实现部分内容替换
- Sql语句实现不同记录同一属性列的差值计算
- mysql 查询指定日期时间内sql语句实现原理与代码
- SQL语句实现SQL Server及ACCESS复制表结构或表结构及内容到新的表
- oracle:两条sql语句实现层次查询的反序权值计算与输出
- 计算SQL语句执行时间的方法
- 计算SQL语句执行时间的方法
- SQL语句实现:输入开始和结束时间,得到1小时间隔的平均数据。