日期:2014-05-18 浏览次数:20488 次
流水表A IP 时间 192.168.1.1 2012-02-01 08:00:00 192.168.1.3 2012-02-01 08:00:01 192.168.1.3 2012-02-01 08:01:00 192.168.1.1 2012-02-01 08:01:00 192.168.1.1 2012-02-01 08:06:00 192.168.1.3 2012-02-01 08:07:00 192.168.1.3 2012-02-01 09:01:00 192.168.1.4 2012-02-01 09:07:00 192.168.1.4 2012-02-01 09:08:00 基础表B IP 开始时间1 结束时间1 开始时间2 结束时间2 192.168.1.1 9:00 11:30 14:00 17:30 192.168.1.2 9:00 11:30 14:00 17:30 192.168.1.3 9:00 11:30 14:00 17:30 192.168.1.4 9:00 11:30 14:00 17:30 192.168.1.5 9:00 11:30 14:00 17:30 结果是 IP 开始时间 结束时间 差距 192.168.1.1 2012-02-01 09:00:00.000 2012-02-01 10:00:00.000 60 192.168.1.2 2012-02-01 09:00:00.000 2012-02-01 10:00:00.000 60 192.168.1.3 2012-02-01 09:01:00.000 2012-02-01 10:00:00.000 59 192.168.1.4 2012-02-01 09:00:00.000 2012-02-01 09:07:00.000 7 192.168.1.4 2012-02-01 09:00:00.000 2012-02-01 09:08:00.000 8 192.168.1.4 2012-02-01 09:08:00.000 2012-02-01 10:00:00.000 52 192.168.1.4 2012-02-01 09:07:00.000 2012-02-01 10:00:00.000 53 192.168.1.5 2012-02-01 09:00:00.000 2012-02-01 10:00:00.000 60 并没有解决到实际问题 所需要的结果是,请注意192.168.1.4的记录,也就是说如果【两个相近时间】差小于5分钟就不在结果集中 IP 开始时间 结束时间 差距 192.168.1.1 2012-02-01 09:00:00.000 2012-02-01 10:00:00.000 60 192.168.1.2 2012-02-01 09:00:00.000 2012-02-01 10:00:00.000 60 192.168.1.3 2012-02-01 09:01:00.000 2012-02-01 10:00:00.000 59 192.168.1.4 2012-02-01 09:00:00.000 2012-02-01 09:07:00.000 7 192.168.1.4 2012-02-01 09:08:00.000 2012-02-01 10:00:00.000 52 192.168.1.5 2012-02-01 09:00:00.000 2012-02-01 10:00:00.000 60
create table ta (IP varchar(15), 时间 datetime) insert into ta select '192.168.1.1', '2012-02-01 08:00:00' union all select '192.168.1.3', '2012-02-01 08:00:01' union all select '192.168.1.3', '2012-02-01 08:01:00' union all select '192.168.1.1', '2012-02-01 08:01:00' union all select '192.168.1.1', '2012-02-01 08:06:00' union all select '192.168.1.3', '2012-02-01 08:07:00' union all select '192.168.1.3', '2012-02-01 09:01:00' union all select '192.168.1.4', '2012-02-01 09:07:00' union all select '192.168.1.4', '2012-02-01 09:08:00' create table tb (IP varchar(15), 开始时间1 varchar(6), 结束时间1 varchar(6), 开始时间2 varchar(6), 结束时间2 varchar(6)) insert into tb select '192.168.1.1', '9:00', '11:30', '2:00', '5:30' union all select '192.168.1.2', '9:00', '11:30', '2:00', '5:30' union all select '192.168.1.3', '9:00', '11:30', '2:00', '5:30' union all select '192.168.1.4', '9:00', '11:30', '2:00', '5:30' union all select '192.168.1.5', '9:00', '11:30', '2:00', '5:30' declare @c datetime select @c='2012-02-01 10:00:00' ;with t1 as (select IP,cast(convert(varchar,@c,23)+' '+tb.开始时间1 as datetime) dt from tb union all select IP,cast(convert(varchar,@c,23)+' '+tb.结束时间1 as datetime) dt from tb ), t2 as (select ta.IP, ta.时间 dt from ta inner join tb on ta.IP=tb.IP where ta.时间 between convert(varchar,@c,23)+' '+tb.开始时间1 and convert(varchar,@c,23)+' '+tb.结束时间1 ), t4 as (select t3.IP,t3.dt,row_number() over(partition by t3.IP order by t3.dt) rn from (select * from t1 union all select * from t2) t3 ), t5 as (select t41.IP,t41.dt dt1,t42.dt dt2,@c currenttime from (select * from t4 where dt<=@c) t41 left join (select * from t4 where dt<=@c) t42 on t41.IP=t42.IP and t41.rn=t42.rn-1 ) select IP,dt1 '开始时间',isnull(dt2,current