SQL Server 2008, 关于查询表内的时间段数据是不是重叠
SQL Server 2008, 关于查询表内的时间段数据是否重叠
每一条数据有一个开始时间c1, 结束时间c2 统计该表所有数据中时间范围,临界点也算 求大神支招!
如第1条 ,第2条 9点00-9点30 重叠
第 4,5 条 在11点30分有重叠
存储过程或者SQL 都可以。
------解决思路----------------------
------解决思路----------------------
没人回复就直接改改回复内容,看看是不是这样的显示效果
表结构, 测试数据, 期望得到该表是否有时间段重叠
create table dbo.t1 (id int primary key identity(1,1) not null,c1 datetime,c2 datetime);
insert into dbo.t1 (c1 ,c2 )
select '2014-01-29 08:00:00.000','2014-01-29 09:30:00.000'
union all
select '2014-01-29 09:00:00.000','2014-01-29 09:30:00.000'
union all
select '2014-01-30 13:00:00.000','2014-01-30 14:30:00.000'
union all
select '2014-02-01 10:00:00.000','2014-02-01 11:30:00.000'
union all
select '2014-02-01 11:30:00.000','2014-02-01 13:00:00.000';
go
每一条数据有一个开始时间c1, 结束时间c2 统计该表所有数据中时间范围,临界点也算 求大神支招!
如第1条 ,第2条 9点00-9点30 重叠
第 4,5 条 在11点30分有重叠
存储过程或者SQL 都可以。
------解决思路----------------------
select* from t1 as a join t1 as b on a.id<b.id
where (b.c1 between a.c1 and a.c2) or
(b.c2 between a.c1 and a.c2)
--结果
id c1 c2 id c1 c2
----------- ----------------------- ----------------------- ----------- ----------------------- -----------------------
1 2014-01-29 08:00:00.000 2014-01-29 09:30:00.000 2 2014-01-29 09:00:00.000 2014-01-29 09:30:00.000
4 2014-02-01 10:00:00.000 2014-02-01 11:30:00.000 5 2014-02-01 11:30:00.000 2014-02-01 13:00:00.000
(2 行受影响)
为空表示没有重复。有几行 表示有几对时间重复。
看着2个ID就知道那几行重复了
------解决思路----------------------
没人回复就直接改改回复内容,看看是不是这样的显示效果
go
SELECT
a.ID,a.c1,a.c2,RTRIM(a.ID)+'~'+rtrim(MIN(b.ID)) AS 重复记录IDs
FROM t1 AS a
INNER JOIN t1 AS b ON a.ID<=b.ID
WHERE NOT EXISTS(SELECT 1 FROM t1 WHERE ID=a.ID-1 AND (c1<=a.c2 AND c2>=a.c1))
AND NOT EXISTS(SELECT 1 FROM t1 WHERE ID=b.ID+1 AND (c1<=b.c2 AND c2>=b.c1))
GROUP BY a.ID,a.c1,a.c2
HAVING a.ID!=MIN(b.ID)
/*
ID c1 c2 重复记录IDs
1 2014-01-29 08:00:00.000 2014-01-29 09:30:00.000 1~2
4 2014-02-01 10:00:00.000 2014-02-01 11:30:00.000 4~5
*/