- 爱易网页
 
                        - 
                            MSSQL教程
 
                        - 求合并重复时间的方法解决方案 
 
                         
                    
                    
                    日期:2014-05-18  浏览次数:20756 次 
                    
                        
                         求合并重复时间的方法
如有表A 
 开始时间            结束时间 
 2007-01-01   7:00:00            2007-01-01   9:00:00 
 2007-01-01   9:00:00            2007-01-01   10:00:00 
 2007-01-01   13:00:00            2007-01-01   16:00:00 
 2007-01-01   15:00:00            2007-01-01   18:00:00 
 2007-01-01   19:00:00            2007-01-01   20:00:00 
  
 要求时间有重叠或相连的合并,结果为 
 开始时间            结束时间 
 2007-01-01   7:00:00            2007-01-01   10:00:00 
 2007-01-01   13:00:00            2007-01-01   18:00:00 
 2007-01-01   19:00:00            2007-01-01   20:00:00 
  
  
 谢谢各位了~ 
------解决方案--------------------
-- 示例数据 
 DECLARE @A TABLE( 
 	开始时间 datetime, 
 	结束时间 datetime 
 ) 
 INSERT  @A     
 SELECT   '2007-01-01  7:00:00 ',   '2007-01-01  9:00:00 '  UNION  ALL   
 SELECT   '2007-01-01  6:00:00 ',   '2007-01-01  10:00:00 '  UNION  ALL   
 SELECT   '2007-01-01  13:00:00 ',   '2007-01-01  16:00:00 '  UNION  ALL   
 SELECT   '2007-01-01  15:00:00 ',   '2007-01-01  18:00:00 '  UNION  ALL   
 SELECT   '2007-01-01  19:00:00 ',   '2007-01-01  20:00:00 '  
  
 -- 有效数据放入临时表 
 SELECT 
 	* 
 INTO # 
 FROM @A A 
 WHERE NOT EXISTS( 
 		SELECT * FROM @A 
 		WHERE 开始时间  < A.开始时间 
 			AND 结束时间 >  A.结束时间) 
  
 SELECT  
 	开始时间 = ( 
 		SELECT  
 			MAX(开始时间) 
 		FROM # B 
 		WHERE 结束时间  <= A.结束时间 
 			AND NOT EXISTS( 
 				SELECT * FROM # 
 				WHERE B.开始时间  <= 结束时间 
 						AND B.结束时间 >  结束时间) 
 		), 
 	结束时间 
 FROM # A 
 WHERE NOT EXISTS( 
 		SELECT * FROM # 
 		WHERE (A.结束时间 > = 开始时间 
 				AND A.开始时间  < 开始时间) 
 	) 
 DROP TABLE # 
  
 -- 结果: 
 开始时间                    结束时间 
 ----------------------- ----------------------- 
 2007-01-01 06:00:00.000 2007-01-01 10:00:00.000 
 2007-01-01 13:00:00.000 2007-01-01 18:00:00.000 
 2007-01-01 19:00:00.000 2007-01-01 20:00:00.000 
  
 (3 行受影响) 
------解决方案--------------------
DECLARE @A TABLE( 
 	开始时间 datetime, 
 	结束时间 datetime 
 ) 
 INSERT @A  
 SELECT   '2007-01-01  7:00:00 ',   '2007-01-01  9:00:00 '  UNION  ALL   
 SELECT   '2007-01-01  6:00:00 ',   '2007-01-01  10:00:00 '  UNION  ALL   
 SELECT   '2007-01-01  13:00:00 ',   '2007-01-01  16:00:00 '  UNION  ALL   
 SELECT   '2007-01-01  15:00:00 ',   '2007-01-01  18:00:00 '  UNION  ALL   
 SELECT   '2007-01-01  9:00:00 ',   '2007-01-01  10:00:00 '  
  
 select *,0 as group_id into # from @a order by 开始时间,结束时间 
 declare @begin datetime,@end datetime,@tmp datetime,@i int 
 set @i = 1 
  
 update # 
 set @i = case when 开始时间 between @begin and @end then @i else @i+1 end 
 	,@begin = 开始时间,@end = 结束时间,group_id = @i 
  
 select min(开始时间) as 开始时间,max(结束时间) as 结束时间 from # group by group_id 
 go 
 drop table # 
 /* 
 开始时间                                                   结束时间                                                    
 ------------------------------------------------------ ------------------------------------------------------  
 2007-01-01 06:00:00.000                                2007-01-01 10:00:00.000 
 2007-01-01 13:00:00.000                                2007-01-01 18:00:00.000