首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

查找出某一天没有工作解决思路

2012-04-07 
查找出某一天没有工作表名incident:编号,员工名称,工作名称,开始时间,结束时间。SQL codeselect ID,Name,Wo

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

SQL code
select ID,Name,WorkName,RBTime,RFTime from incident编号,员工名称,工作名称,开始时间,结束时间1      王八     写代码    2012-3-3  2012-3-122      六偢     跑龙套    2012-3-4  2012-3-203      鳖蛋     看片子    2012-3-3  2012-3-114      王八     跑龙套    2012-3-14  2012-3-185      六偢     看片子    2012-3-22  2012-3-246      鳖蛋     写代码    2012-3-13  2012-3-217      王八     看片子    2012-3-17  2012-3-318      六偢     写代码    2012-3-24  2012-3-319      鳖蛋     跑龙套    2012-3-22  2012-3-31


[解决办法]
用一个日期档左关联 where ** is null 的就是没有工作的日期
[解决办法]
探讨

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

[解决办法]
SQL code
----创建测试数据表drop table #incidentcreate 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 #dtcreate table #dt(c_dt datetime)delete  from #dt---定义日期段变量并赋值declare @dt_st datetimedeclare @dt_en datetimedeclare @dt_emp datetimeselect @dt_st = '20120301'select @dt_en = '20120331'set @dt_emp = @dt_st---建立连续日期数据while DATEDIFF(DAY,@dt_en,@dt_emp) <=0begin    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 #ucreate table #u(c_user varchar(10))---插入用户数据delete from #uinsert 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-122      六偢     跑龙套    2012-3-4  2012-3-203      鳖蛋     看片子    2012-3-3  2012-3-114      王八     跑龙套    2012-3-14  2012-3-185      六偢     看片子    2012-3-22  2012-3-246      鳖蛋     写代码    2012-3-13  2012-3-217      王八     看片子    2012-3-17  2012-3-318      六偢     写代码    2012-3-24  2012-3-319      鳖蛋     跑龙套    2012-3-22  2012-3-31create table #t (id int, name nvarchar(10), start date, stop date)insert into #tselect 1,N'王八',cast('2012-3-3' as date),  cast('2012-3-12' as date) union allselect 2,N'六偢',cast('2012-3-4' as date),  cast('2012-3-20' as date) union allselect 3,N'鳖蛋',cast('2012-3-3' as date),  cast('2012-3-11' as date) union allselect 4,N'王八',cast('2012-3-14' as date),  cast('2012-3-18' as date) union allselect 5,N'六偢',cast('2012-3-22' as date),  cast('2012-3-24' as date) union allselect 6,N'鳖蛋',cast('2012-3-13' as date),  cast('2012-3-21' as date) union allselect 7,N'王八',cast('2012-3-17' as date),  cast('2012-3-31' as date) union allselect 8,N'六偢',cast('2012-3-24' as date),  cast('2012-3-31' as date) union allselect 9,N'鳖蛋',cast('2012-3-22' as date),  cast('2012-3-31' as date) -- create march calendar tabledeclare @d as datecreate table #c(d date)set @d = CAST('2012-3-1' as date)while(@d<CAST('2012-4-1' as date))begin  insert into #c values(@d)  set @d = DATEADD(d,1,@d)endselect d.name,d.d from #t t join #c c on c.d between t.start and t.stop right join(select distinct name, d from #t , #c) don c.d = d.d and t.name = d.namewhere id is null/* resultname    d六偢    2012-03-01六偢    2012-03-02六偢    2012-03-03六偢    2012-03-21王八    2012-03-01王八    2012-03-02王八    2012-03-13鳖蛋    2012-03-01鳖蛋    2012-03-02鳖蛋    2012-03-12*/ 


[解决办法]

SQL code
 GO/****** Object:  Table [dbo].[incident]    Script Date: 04/01/2012 13:43:49 ******/SET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOSET ANSI_PADDING ONGOCREATE TABLE [dbo].[incident](    [id] [int] IDENTITY(1,1) NOT NULL,    [Name] [varchar](20) NULL,    [WorkName] [varchar](50) NULL,    [RBTime] datetime NULL,    [RFTime] datetime NULL) ON [PRIMARY]GOSET ANSI_PADDING OFFGOinsert into incident values( '王八'   ,  '写代码'   , '2012-4-3' , '2012-4-12')insert into incident values(   '六偢'  ,   '跑龙套'  ,  '2012-4-4' , '2012-4-20')insert into incident values(  '鳖蛋'  ,   '看片子'  ,  '2012-3-3'  ,'2012-3-11')insert into incident values( '王八'  ,   '跑龙套' ,   '2012-4-14' , '2012-4-18')insert into incident values(  '六偢'  ,   '看片子'  ,  '2012-4-22' , '2012-4-24')insert into incident values(  '鳖蛋'  ,   '写代码'  ,  '2012-3-13' , '2012-3-21')insert into incident values(   '王八'  ,   '看片子'  ,  '2012-4-17' , '2012-4-30')insert into incident values(  '六偢'  ,   '写代码'  ,  '2012-4-24' , '2012-4-30') insert into incident values(  '鳖蛋'  ,   '跑龙套'  ,  '2012-3-22' , '2012-3-31')select Name, DD FROM (select *,rn=ROW_NUMBER()over(partition by Name,dd order by dd) from (select n.*,DATEPART(DD,n.Times)as dd from (select i.Name,i.WorkName,DATEADD(DD,number-1,i.RBTime)as Times from incident i , master..spt_values s where s.type='p' and  s.number between 1 and datediff(DD,RBTime,RFTime)+1  )m  full join ( select i.Name,i.WorkName,DATEADD(DD,number-1,DATEADD(mm, DATEDIFF(mm,0,getdate()), 0))as Times from incident i , master..spt_values s where s.type='p' and  s.number between 1 and  day(dateadd(month,1,getdate()) - day(getdate()))   )n on m.Name=n.Name and m.Times=n.Times and m.WorkName=n.WorkName where m.Name is null )a )F where rn=3  --SELECT * FROM incident  drop table incident(1 行受影响)(1 行受影响)Name                 DD-------------------- -----------鳖蛋                   1鳖蛋                   2鳖蛋                   3鳖蛋                   4鳖蛋                   5鳖蛋                   6鳖蛋                   7鳖蛋                   8鳖蛋                   9鳖蛋                   10鳖蛋                   11鳖蛋                   12鳖蛋                   13鳖蛋                   14鳖蛋                   15鳖蛋                   16鳖蛋                   17鳖蛋                   18鳖蛋                   19鳖蛋                   20鳖蛋                   21鳖蛋                   22鳖蛋                   23鳖蛋                   24鳖蛋                   25鳖蛋                   26鳖蛋                   27鳖蛋                   28鳖蛋                   29鳖蛋                   30六偢                   1六偢                   2六偢                   3六偢                   21王八                   1王八                   2王八                   13(37 行受影响)
[解决办法]
SQL code
10 楼的下面 BETWEEN AND 很好使,但是看不明白。谁给解释一下。select d.name,d.d from #t t join #c c on c.d between t.start and t.stop right join(select distinct name, d from #t , #c) don c.d = d.d and t.name = d.namewhere id is null
[解决办法]
明了。
看来 还需修行呀。
[解决办法]
那你可以把null替换成当前时间,这样按照相应算法出来的结果应该是一样
isnull(结束时间,getdate()) as 结束时间

探讨

看见各位各位大神的算法,长见识了。另外我再提出个问题,如果 结束时间为null责代表该工作还在进行中。

热点排行
Bad Request.