wshr_xing 2022-03-05 14:59 采纳率: 100%
浏览 146
已结题

sql求出每两个相邻的时间差

下面有一组Period_Key的时间, 要求求出每两个相邻Load_Time的时间差。
Period_Key Load_Time
20160101 2016-07-12 08:44:07
20160102 2016-07-12 08:47:08
20160103 2016-07-12 08:50:05
20160104 2016-07-12 08:52:59
20160105 2016-07-12 08:55:55
20160106 2016-07-12 08:58:50

  • 写回答

1条回答 默认 最新

  • DarkAthena ORACLE应用及数据库设计方案咨询师 2022-03-05 16:03
    关注

    问sql以及数据库相关的题,请先说明使用的数据库类型以及数据库版本,因为不同数据库支持的sql写法不一样;
    还有,需要提供相关的create table 和insert的sql,因为不同的字段类型处理方式也会不一样。
    假设你用的数据库是oracle,支持开窗函数,date类型也可以直接相减,那么可以使用lag或者lead来查询上一行或者下一行

    select a.*,
    lag(a.Load_Time) over(order by a.Period_Key) 上一行的时间,
    lag(a.Load_Time) over(order by a.Period_Key)- a.Load_Time 时间差天数,
    (lag(a.Load_Time) over(order by a.Period_Key)- a.Load_Time)*24*60*60 时间差秒数
     froma
    

    如果是sqlserver,在使用开窗函数获得上一行的时间后,用 datediff(second, 开始日期,结束日期) 来计算时间差

    select a.*,
    lag(a.Load_Time) over(order by a.Period_Key) 上一行的时间,
    datediff(second, lag(a.Load_Time) over(order by a.Period_Key),a.Load_Time)  时间差秒数
     froma
    

    但sqlserver2008版本太老了,不确定是否有lag函数,当前没有环境可以测试

    img

    微软官方都没有提供这个版本的文档了

    img


    刚在官网一个角落找到了sqlserver2008r2的文档,里面没有介绍有关开窗函数的内容

    除了使用开窗函数以外,要在本行查询到非本行数据,只能使用自关联了,
    针对此题,先把第一个字段转换成日期类型,然后这个表自己join自己,关联on的条件是前一个表的日期等于后一个表的日期加一天,这样就能把上下相邻的两行放到同一行里了,此时可以使用datediff函数计算时间差

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录

报告相同问题?

问题事件

  • 系统已结题 3月13日
  • 已采纳回答 3月5日
  • 创建了问题 3月5日

悬赏问题

  • ¥15 openwrt双栈NAT
  • ¥15 部分网页页面无法显示!
  • ¥15 怎样解决power bi 中设置管理聚合,详细信息表和详细信息列显示灰色,而不能选择相应的内容呢?
  • ¥15 QTOF MSE数据分析
  • ¥15 平板录音机录音问题解决
  • ¥15 请问维特智能的安卓APP在手机上存储传感器数据后,如何找到它的存储路径?
  • ¥15 (SQL语句|查询结果翻了4倍)
  • ¥15 Odoo17操作下面代码的模块时出现没有'读取'来访问
  • ¥50 .net core 并发调用接口问题
  • ¥15 网上各种方法试过了,pip还是无法使用