关闭 x
IT技术网
    技 采 号
    ITJS.cn - 技术改变世界
    • 实用工具
    • 菜鸟教程
    IT采购网 中国存储网 科技号 CIO智库

    IT技术网

    IT采购网
    • 首页
    • 行业资讯
    • 系统运维
      • 操作系统
        • Windows
        • Linux
        • Mac OS
      • 数据库
        • MySQL
        • Oracle
        • SQL Server
      • 网站建设
    • 人工智能
    • 半导体芯片
    • 笔记本电脑
    • 智能手机
    • 智能汽车
    • 编程语言
    IT技术网 - ITJS.CN
    首页 » SQL语言 »实现内容的时间交集计算的sql语句

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

    2010-09-27 16:26:00 出处:ITJS
    分享

    sql语句可以实现大量我们需要的功能,下面介绍的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  

    上一篇返回首页 下一篇

    声明: 此文观点不代表本站立场;转载务必保留本文链接;版权疑问请联系我们。

    别人在看

    正版 Windows 11产品密钥怎么查找/查看?

    还有3个月,微软将停止 Windows 10 的更新

    Windows 10 终止支持后,企业为何要立即升级?

    Windows 10 将于 2025年10 月终止技术支持,建议迁移到 Windows 11

    Windows 12 发布推迟,微软正全力筹备Windows 11 25H2更新

    Linux 退出 mail的命令是什么

    Linux 提醒 No space left on device,但我的空间看起来还有不少空余呢

    hiberfil.sys文件可以删除吗?了解该文件并手把手教你删除C盘的hiberfil.sys文件

    Window 10和 Windows 11哪个好?答案是:看你自己的需求

    盗版软件成公司里的“隐形炸弹”?老板们的“法务噩梦” 有救了!

    IT头条

    公安部:我国在售汽车搭载的“智驾”系统都不具备“自动驾驶”功能

    02:03

    液冷服务器概念股走强,博汇、润泽等液冷概念股票大涨

    01:17

    亚太地区的 AI 驱动型医疗保健:2025 年及以后的下一步是什么?

    16:30

    智能手机市场风云:iPhone领跑销量榜,华为缺席引争议

    15:43

    大数据算法和“老师傅”经验叠加 智慧化收储粮食尽显“科技范”

    15:17

    技术热点

    商业智能成CIO优先关注点 技术落地方显成效(1)

    用linux安装MySQL时产生问题破解

    JAVA中关于Map的九大问题

    windows 7旗舰版无法使用远程登录如何开启telnet服务

    Android View 事件分发机制详解

    MySQL用户变量的用法

      友情链接:
    • IT采购网
    • 科技号
    • 中国存储网
    • 存储网
    • 半导体联盟
    • 医疗软件网
    • 软件中国
    • ITbrand
    • 采购中国
    • CIO智库
    • 考研题库
    • 法务网
    • AI工具网
    • 电子芯片网
    • 安全库
    • 隐私保护
    • 版权申明
    • 联系我们
    IT技术网 版权所有 © 2020-2025,京ICP备14047533号-20,Power by OK设计网

    在上方输入关键词后,回车键 开始搜索。Esc键 取消该搜索窗口。