利用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)