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

利用SQL统计时间时如何去除周末的时间(非工作日时间),小弟我需要的是工作时间.

2012-01-22 
利用SQL统计时间时怎么去除周末的时间(非工作日时间),我需要的是工作时间.如下:表1    Dept_IDEmpNoStartE

利用SQL统计时间时怎么去除周末的时间(非工作日时间),我需要的是工作时间.
如下:表1
    Dept_ID             EmpNo                           Start                     End
                A1000                 C0701006               2006-10-10             2006-11-01
                B2000                 C0607003               2006-12-13             2006-12-29
                C3000                 C0501007               2007-02-02             2007-03-01
   
     表2
    DateOfThis             EventType_FK       WorkingDay_Flag        
                .........                   .........                 ........
                2006-10-10                       85                             1
                2006-10-11                       85                             1
                2006-10-12                       85                             1
                2006-10-13                       85                             1
      *       2006-10-14                       82                             0             为星期天
      *       2006-10-15                       82                             0   为星期天
                2006-10-16                       85                             1
                2006-10-17                       85                             1
                2006-10-18                       85                             1


                2006-10-19                       85                             1
                2006-10-20                       85                             1
      *       2006-10-21                       82                             0   为星期天
      *       2006-10-22                       82                             0   为星期天
                .........                     .........                 ........
               
现在要求把周末的时间去掉..该如何解决呢???


[解决办法]
关于 周六 周日 的 数据过滤
表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
end

select 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)

热点排行