- 爱易网页
-
MSSQL教程
- 求合并重复时间的方法解决方案
日期:2014-05-18 浏览次数:20616 次
求合并重复时间的方法
如有表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