日期:2014-05-18 浏览次数:20623 次
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 王八 跑龙套