Sql server 同一时间段内相同项重复数据

qinw2007 2011-11-21 09:48:04
比如 有表如下
姓名,培训项目名称,培训地点,开始日期,开始时间,结束日期,结束时间
-----------------------------------------------------------------
张三,公务培训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

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












...全文
377 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
-晴天 2011-11-27
  • 打赏
  • 举报
回复
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
qinw2007 2011-11-27
  • 打赏
  • 举报
回复
重发一次,比如 有表如下
姓名,培训项目名称,培训地点,开始日期,开始时间,结束日期,结束时间
-----------------------------------------------------------------
张三,公务培训,北京,2009-01-03,9,2009-01-09,17
李四,公务培训,北京,2011-01-03,9,2011-01-09,17
王五,公务培训1,北京,2011-01-03,9,2011-01-09,17
赵六,公务培训1,北京,2011-01-03,9,2011-01-09,17
张三,公务培训,上海,2011-01-04,9,2011-01-06,16
王五,公务培训3,南京,2011-01-05,9,2011-01-10,11
王五,公务培训4,济南,2011-01-07,9,2011-01-10,17
张三,公务培训,杭州,2011-01-06,9,2011-01-06,16
张三,公务培训6,苏州,2011-01-09,9,2011-01-16,17

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

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

能否精确到开始时间,结束时间
qinw2007 2011-11-27
  • 打赏
  • 举报
回复
这是做数据校验用的,录入人员为完成任务会培训项目名称录入同名的,我让校验一个人不能在同一时间段参加不同的培训!
qinw2007 2011-11-27
  • 打赏
  • 举报
回复
楼上的,若培训项目名称一样如何?
唐诗三百首 2011-11-23
  • 打赏
  • 举报
回复

create table tb(姓名 nvarchar(10),培训项目名称 nvarchar(10),培训地点 nvarchar(10),开始日期 datetime,开始时间 int,结束日期 datetime,结束时间 int)

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 '王五','公务培训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 '张三','公务培训2','上海','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 '张三','公务培训5','杭州','2011-01-06',9,'2011-01-06',16
insert into tb select '张三','公务培训6','苏州','2011-01-09',9,'2011-01-16',17

select a.*
from tb a
inner join tb b on a.姓名=b.姓名
and a.培训项目名称<>b.培训项目名称
and a.开始日期 between b.开始日期 and b.结束日期
order by a.姓名 desc,a.培训项目名称

姓名 培训项目名称 培训地点 开始日期 开始时间 结束日期 结束时间
---------- ---------- ---------- ----------------------- ----------- ----------------------- -----------
张三 公务培训2 上海 2011-01-04 00:00:00.000 9 2011-01-06 00:00:00.000 16
张三 公务培训5 杭州 2011-01-06 00:00:00.000 9 2011-01-06 00:00:00.000 16
张三 公务培训5 杭州 2011-01-06 00:00:00.000 9 2011-01-06 00:00:00.000 16
张三 公务培训6 苏州 2011-01-09 00:00:00.000 9 2011-01-16 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
王五 公务培训4 济南 2011-01-07 00:00:00.000 9 2011-01-10 00:00:00.000 17

(7 row(s) affected)
qinw2007 2011-11-22
  • 打赏
  • 举报
回复
谢谢楼上的,没注意结束时间,呵呵~~

-晴天 2011-11-21
  • 打赏
  • 举报
回复
create table tb(姓名 nvarchar(10),培训项目名称 nvarchar(10),培训地点 nvarchar(10),开始日期 datetime,开始时间 int,结束日期 datetime,结束时间 int)
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 '王五','公务培训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 '张三','公务培训2','上海','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 '张三','公务培训5','杭州','2011-01-06',9,'2011-01-06',16
insert into tb select '张三','公务培训6','苏州','2011-01-09',9,'2011-01-16',17
go
select * from tb a
where exists(select 1 from tb where 姓名=a.姓名 and 培训项目名称<>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,开始时间,开始日期))))
/*
姓名 培训项目名称 培训地点 开始日期 开始时间 结束日期 结束时间
---------- ---------- ---------- ----------------------- ----------- ----------------------- -----------
张三 公务培训1 北京 2011-01-03 00:00:00.000 9 2011-01-09 00:00:00.000 17
王五 公务培训1 北京 2011-01-03 00:00:00.000 9 2011-01-09 00:00:00.000 17
张三 公务培训2 上海 2011-01-04 00:00:00.000 9 2011-01-06 00:00:00.000 16
王五 公务培训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
张三 公务培训5 杭州 2011-01-06 00:00:00.000 9 2011-01-06 00:00:00.000 16
张三 公务培训6 苏州 2011-01-09 00:00:00.000 9 2011-01-16 00:00:00.000 17

(7 行受影响)

*/
go
drop table tb
-晴天 2011-11-21
  • 打赏
  • 举报
回复
被忽悠了....
哪有2011年开始的事情,2009年结束的啊!

22,209

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧