日期:2014-05-18 浏览次数:20489 次
select ID,Name,WorkName,RBTime,RFTime from incident 编号,员工名称,工作名称,开始时间,结束时间 1 王八 写代码 2012-3-3 2012-3-12 2 六偢 跑龙套 2012-3-4 2012-3-20 3 鳖蛋 看片子 2012-3-3 2012-3-11 4 王八 跑龙套 2012-3-14 2012-3-18 5 六偢 看片子 2012-3-22 2012-3-24 6 鳖蛋 写代码 2012-3-13 2012-3-21 7 王八 看片子 2012-3-17 2012-3-31 8 六偢 写代码 2012-3-24 2012-3-31 9 鳖蛋 跑龙套 2012-3-22 2012-3-31
----创建测试数据表 drop table #incident create table #incident (ID int, Name varchar(10), WorkName varchar(10), RBTime datetime, RFTime datetime) ----建立测试数据 insert into #incident (ID,Name,WorkName,RBTime,RFTime) values ('1','王八','写代码','2012-3-3','2012-3-12') insert into #incident (ID,Name,WorkName,RBTime,RFTime) values ('2','六偢','跑龙套','2012-3-4','2012-3-20') insert into #incident (ID,Name,WorkName,RBTime,RFTime) values ('3','鳖蛋','看片子','2012-3-3','2012-3-11') insert into #incident (ID,Name,WorkName,RBTime,RFTime) values ('4','王八','跑龙套','2012-3-14','2012-3-18') insert into #incident (ID,Name,WorkName,RBTime,RFTime) values ('5','六偢',' 看片子','2012-3-22','2012-3-24') insert into #incident (ID,Name,WorkName,RBTime,RFTime) values ('6','鳖蛋','写代码','2012-3-13 ','2012-3-21') insert into #incident (ID,Name,WorkName,RBTime,RFTime) values ('7','王八','看片子','2012-3-17 ',' 2012-3-31') insert into #incident (ID,Name,WorkName,RBTime,RFTime) values ('8','六偢','写代码','2012-3-24 ',' 2012-3-31') insert into #incident (ID,Name,WorkName,RBTime,RFTime) values ('9','鳖蛋','跑龙套','2012-3-22 ',' 2012-3-31') ---select * from #incident ----创建连续时间临时表 drop table #dt create table #dt (c_dt datetime) delete from #dt ---定义日期段变量并赋值 declare @dt_st datetime declare @dt_en datetime declare @dt_emp datetime select @dt_st = '20120301' select @dt_en = '20120331' set @dt_emp = @dt_st ---建立连续日期数据 while DATEDIFF(DAY,@dt_en,@dt_emp) <=0 begin insert into #dt(c_dt) values (@dt_emp) set @dt_emp = DATEADD(DAY,1,@dt_emp) end ----从所有人员的数据比对出没有工作的时间 select distinct all_work.Name,all_work.c_dt from (select * from #incident,#dt) all_work where not exists (select * from (select * from #incident,#dt where DATEDIFF(DAY,#incident.RBTime,#dt.c_dt)>=0 and DATEDIFF(DAY,#incident.RFTime,#dt.c_dt)<=0) do_work where all_work.Name = do_work.Name and all_work.c_dt = do_work.c_dt) order by all_work.Name,all_work.c_dt /*************** 此过程有一个缺点,就是如果某人一天都不工作,就不会在这个表出现 所以建议all_work用一个用户表和连续时间表创建数据 ************/ ----创建用户表 drop table #u create table #u (c_user varchar(10)) ---插入用户数据 delete from #u insert into #u(c_user) select distinct name from #incident ---插入另一个人员 insert into #u(c_user) values('懒蛋') ----从所有人员的数据比对出没有工作的时间 select distinct all_work.c_user,all_work.c_dt from (select * from #u,#dt) all_work where not exists (select * from (select * from #incident,#dt where DATEDIFF(DAY,#incident.RBTime,#dt.c_dt)>=0 and DATEDIFF(DAY,#incident.RFTime,#dt.c_dt)<=0) do_work where all_work.c_user = do_work.Name and all_work.c_dt = do_work.c_dt) order by all_work.c_user,all_work.c_dt
------解决方案--------------------
select ID,Name,WorkName,RBTime,RFTime from incident 编号,员工名称,工作名称,开始时间,结束时间 1 王八 写代码 2012-3-3 2012-3-12 2 六偢 跑龙套 2012-3-4 2012-3-20 3 鳖蛋 看片子 2012-3-3 2012-3-11 4 王八 跑龙套