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

查找出某一天没有工作
表名incident:编号,员工名称,工作名称,开始时间,结束时间。
SQL code

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



------解决方案--------------------
用一个日期档左关联 where ** is null 的就是没有工作的日期
------解决方案--------------------
探讨

等下帮你写个。之前那个帖子他们写的都有点问题。

------解决方案--------------------
SQL code

----创建测试数据表
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

------解决方案--------------------
SQL code


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      王八     跑龙套