我司每天工作8小时,但上下班时间分多个班次.
8:00---12:00  13:30---17:30
8:00---11:30  13:30---18:00
8:00---11:45  13:30---17:45若某人请假从2007/08/01 8:00----  2007/08/03 17:30 如何求出请假3天呢?
若某人请假从2007/08/01 8:00----  2007/08/03 17:45 如何求出请假3天呢?
若某人请假从2007/08/01 8:00----  2007/08/03 12:00 如何求出请假2.5天呢?请赐教.谢谢

解决方案 »

  1.   

    这里有个类似的例:关于 周六 周日 的 数据过滤
    表A 数据如下:SYS_ID    人员    部门      到达时间    离开时间 
    ----------------------------------------------------
    0001      小王   技术部     2006-1-2    2006-1-6
    0002      小王   技术部     2006-1-4    2006-1-10 
    0003      小沈   运销部     2006-1-2    2006-1-3
    0004      小沈   运销部     2006-1-2    2006-1-6
    0005      小李   技术部     2006-1-9    2006-1-13
    0006      小张   技术部     2006-1-11   2006-1-21
    0007      小马   技术部     2006-2-1    2006-2-12
    0007      小马   技术部     2006-4-1    2006-4-9
    .......................................................现在 想查询以下数据:(部门为技术部的人员停留时间超过2天和超过3天的记录总数(周六和周日不能计算在内)):结果应如下:人员    超过3天      超过5天
    小王       ??         ??
    小李                
    小张                 
    小马      
    ................................大家说 周六 和周日 如何过滤掉啊?create table A(SYS_ID char(4), Name nvarchar(10), Dept nvarchar(10), BegTime datetime, EndTime datetime)
    insert A select '0001',      '小王',   '技术部',     '2006-1-2',    '2006-1-6'
    union all select '0002',      '小王',   '技术部',     '2006-1-4',    '2006-1-10' 
    union all select '0003',      '小沈',   '运销部',     '2006-1-2',    '2006-1-3'
    union all select '0004',      '小沈',   '运销部',     '2006-1-2',    '2006-1-6'
    union all select '0005',      '小李',   '技术部',     '2006-1-9',    '2006-1-13'
    union all select '0006',      '小张',   '技术部',     '2006-1-11',  '2006-1-21'
    union all select '0007',      '小马',   '技术部',     '2006-2-1',    '2006-2-12'
    union all select '0007',      '小马',   '技术部',     '2006-4-1',    '2006-4-9'create function fun(@BegTime datetime, @EndTime datetime)
    returns int
    as
    begin
    declare @re int
    set @re=0
    while @BegTime<=@EndTime
    begin
    select @re=@re+1 where (datepart(weekday, @BegTime)+@@datefirst-1)%7 between 1 and 5
    set @BegTime=dateadd(day, 1, @BegTime)
    end return @re
    endselect Name,
    超过3天=sum(case when days>3 then 1 else 0 end),
    超过5天=sum(case when days>5 then 1 else 0 end)
    from(
    select Name, dbo.fun(BegTime, EndTime) as days
    from A 
    where Dept='技术部'
    )a group by Name--result
    Name       超过3天        超过5天        
    ---------- ----------- ----------- 
    小李         1           0
    小马         2           1
    小王         2           0
    小张         1           1(4 row(s) affected)
      

  2.   

    呵呵
    select  (DateDiff(day,'2007/8/1 8:00','2007/8/2 12:00'))+(DateDiff(hour,'2007/8/1 8:00','2007/8/2 12:00'))%24*0.125