日期:2014-05-18  浏览次数:20423 次

Sql server 同一时间段内相同项重复数据
比如 有表如下
姓名,培训项目名称,培训地点,开始日期,开始时间,结束日期,结束时间
-----------------------------
张三,公务培训1,北京,2011-01-03,9,2009-01-09,17
李四,公务培训1,北京,2011-01-03,9,2009-01-09,17
王五,公务培训1,北京,2011-01-03,9,2009-01-09,17
赵六,公务培训1,北京,2011-01-03,9,2009-01-09,17
张三,公务培训2,上海,2011-01-04,9,2009-01-06,16
王五,公务培训3,南京,2011-01-05,9,2009-01-10,11
王五,公务培训4,济南,2011-01-07,9,2009-01-10,17
张三,公务培训5,杭州,2011-01-06,9,2009-01-06,16
张三,公务培训6,苏州,2011-01-09,9,2009-01-16,17

求:相同人员在同一时间段参加不同的培训记录

输出结果如下:
-----------------------------
张三,公务培训1,北京,2011-01-03,9,2009-01-09,17
张三,公务培训2,上海,2011-01-04,9,2009-01-06,16
张三,公务培训5,杭州,2011-01-06,9,2009-01-06,16
张三,公务培训6,苏州,2011-01-09,9,2009-01-16,17
王五,公务培训1,北京,2011-01-03,9,2009-01-09,17
王五,公务培训3,南京,2011-01-05,9,2009-01-10,11
王五,公务培训4,济南,2011-01-07,9,2009-01-10,17

能否精确到开始时间,结束时间














------解决方案--------------------
SQL code
create table tb(姓名 nvarchar(10),培训项目名称 nvarchar(10),培训地点 nvarchar(10),开始日期 datetime,开始时间 int,结束日期 datetime,结束时间 int)
insert into tb select '张三','公务培训','北京','2009-01-03',9,'2009-01-09',17
insert into tb select '李四','公务培训','北京','2011-01-03',9,'2011-01-09',17
insert into tb select '王五','公务培训1','北京','2011-01-03',9,'2011-01-09',17
insert into tb select '赵六','公务培训1','北京','2011-01-03',9,'2011-01-09',17
insert into tb select '张三','公务培训','上海','2011-01-04',9,'2011-01-06',16
insert into tb select '王五','公务培训3','南京','2011-01-05',9,'2011-01-10',11
insert into tb select '王五','公务培训4','济南','2011-01-07',9,'2011-01-10',17
insert into tb select '张三','公务培训','杭州','2011-01-06',9,'2011-01-06',16
insert into tb select '张三','公务培训6','苏州','2011-01-09',9,'2011-01-16',17
--insert into tb select '张三','公务培训7','天津','2011-01-20',9,'2011-01-20',17
go
select * from tb a
where exists(select 1 from tb where 姓名=a.姓名 and (培训项目名称<>a.培训项目名称 or 培训地点<>a.培训地点)
    and (dateadd(hh,a.开始时间,a.开始日期) between dateadd(hh,开始时间,开始日期) and dateadd(hh,结束时间,结束日期)
        or dateadd(hh,a.结束时间,a.结束日期) between dateadd(hh,开始时间,开始日期) and dateadd(hh,结束时间,结束日期)
        or (dateadd(hh,a.开始时间,a.开始日期)<dateadd(hh,开始时间,开始日期) and dateadd(hh,a.结束时间,a.结束日期)>dateadd(hh,开始时间,开始日期))))
order by 姓名

/*
姓名         培训项目名称     培训地点       开始日期                    开始时间        结束日期                    结束时间
---------- ---------- ---------- ----------------------- ----------- ----------------------- -----------
王五         公务培训1      北京         2011-01-03 00:00:00.000 9           2011-01-09 00:00:00.000 17
王五         公务培训3      南京         2011-01-05 00:00:00.000 9           2011-01-10 00:00:00.000 11
王五         公务培训4      济南         2011-01-07 00:00:00.000 9           2011-01-10 00:00:00.000 17
张三         公务培训       杭州         2011-01-06 00:00:00.000 9           2011-01-06 00:00:00.000 16
张三         公务培训       上海         2011-01-04 00:00:00.000 9           2011-01-06 00:00:00.000 16

(5 行受影响)

*/
go
drop table tb