下列数据是某个用户登录时间,因为log日志出现bug,部分记录出现断断续续,请问各位大神有什么办法把记录合并。前后记录在120秒内视为连续,超过120秒视为不连续数据:
start_time                       end_time
2016-07-06 21:18:52 2016-07-06 21:34:53
2016-07-06 23:45:11 2016-07-06 23:47:07
2016-07-06 23:47:11 2016-07-06 23:49:07
2016-07-06 23:49:11 2016-07-06 23:51:07
2016-07-06 23:51:11 2016-07-06 23:53:07
2016-07-06 23:53:11 2016-07-06 23:55:07
2016-07-06 23:55:11 2016-07-06 23:57:07
2016-07-06 23:57:11 2016-07-06 23:59:07
2016-07-06 23:59:11 2016-07-07 0:01:07
2016-07-07 0:01:11 2016-07-07 0:03:07
2016-07-07 0:03:11 2016-07-07 0:05:07
2016-07-07 0:05:11 2016-07-07 0:07:07
2016-07-07 23:50:40 2016-07-07 23:51:40
2016-07-07 23:52:40 2016-07-07 23:53:40
2016-07-07 23:54:40 2016-07-07 23:55:40
2016-07-07 23:56:40 2016-07-07 23:57:40
2016-07-07 23:58:40 2016-07-07 23:59:40
2016-07-08 0:00:40 2016-07-08 0:01:40
2016-07-08 0:02:40 2016-07-08 0:03:40
2016-07-08 0:04:40 2016-07-08 0:05:40
2016-07-08 0:06:40 2016-07-08 0:07:40
2016-07-08 13:50:48 2016-07-08 14:38:55
2016-07-11 23:30:38 2016-07-11 23:54:38
2016-07-14 22:59:28 2016-07-14 23:00:24
2016-07-14 23:01:27 2016-07-14 23:02:24
2016-07-14 23:03:29 2016-07-14 23:04:24
2016-07-14 23:05:27 2016-07-14 23:06:24
2016-07-14 23:07:27 2016-07-14 23:08:24
2016-07-14 23:09:27 2016-07-14 23:10:24
2016-07-14 23:11:27 2016-07-14 23:12:24结果:
2016-07-06 21:18:52 2016-07-06 21:34:53
2016-07-06 23:45:11  2016-07-07 0:07:07
2016-07-07 23:50:40  2016-07-08 0:07:40
2016-07-11 23:30:38 2016-07-11 23:54:38

解决方案 »

  1.   

    研究一下lag() 或者 lead() 函数,这两个函数分别用来取当前记录的前(后)1条或n条记录中某个字段的值,
      

  2.   

    可以转成to_char再计算
    select to_char(end_time,'yyyymmddhh24miss')-to_char(start_time,'yyyymmddhh24miss') from tab;
      

  3.   

    select * from tab 
    where  to_char(end_time,'yyyymmddhh24miss')-to_char(start_time,'yyyymmddhh24miss')>200;
      

  4.   

    需要注意to_char(end_time,'yyyymmddhh24miss')-to_char(start_time,'yyyymmddhh24miss')算出来是10进制的数,你要转换成秒数应该*6/10
      

  5.   

    ceil((t.end_time-t.start_time)* 24 * 60 * 60 )>120
      

  6.   

    select * from tab 
    where (end_time- start_time)*24*60*60>120;
    这样应该也可以,未测试
      

  7.   


    因为前后记录取值是动态的,不能准确每一段区间最小开始时间,和最大的结束时间
    那建议使用存储过程处理吧,太复杂的sql效率也不会高的~