根据时间段,返回时间段的工作小时数

/*  根据时间段,返回时间段的工作小时数:一天按8小时 */

CREATE FUNCTION [dbo].[fc_GetWorkHour] (@startdate smalldatetime,@enddate smalldatetime)

RETURNS int AS 

BEGIN  

declare @delayday int   --暂用工时(日)  

if(@startdate is null)   

        return 0  

if(@enddate is null)   

          return 0  

declare  @tmptb table(dt smalldatetime)   

declare @WeekendNum int   

declare @s smalldatetime    

set @s=@startdate   

while @s<=convert(varchar(4),year(@enddate))+'-'+convert(varchar(2),month(@enddate))+'-'+convert(varchar(2),day(@enddate))+' 23:59'   

begin        

insert into @tmptb select @s set @s=dateadd(day,1,@s)   

end     --时间段内工作日个数   

select @WeekendNum=count(*) from @tmptb where datepart(weekday,dt)  not in (1,7)--工作个数(星期日为1,星期一为2,星期二为3....)   

--开头,结尾是否是工作日,如果是的话,就除去  

 if(datepart(dw,@startdate)>1 and datepart(dw,@startdate)<7)  

 begin    

set @WeekendNum=@WeekendNum-1   

end   

if(datepart(dw,@enddate)>1 and datepart(dw,@enddate)<7)  

 begin    

set @WeekendNum=@WeekendNum-1   

end   

--计算整工作日小时数   

set @delayday= 8*@WeekendNum*60  

 if(@delayday<0)  

 begin    

set @delayday=0   

end        

 if( datediff(dd,@startdate,@enddate)=0)--开始结束同一天   

begin    

set @delayday=datediff(mi,@startdate,@enddate)   

end     

else   

begin    

if(datepart(dw,@startdate)>1 and datepart(dw,@startdate)<7)   

 begin    

 if(datediff(mi,@startdate,convert(varchar(4),year(@startdate))+'-'+convert(varchar(2),month(@startdate))+'-'+convert(varchar(2),day(@startdate))+' 17:30')>0)      

begin            

set @delayday=@delayday+datediff(mi,@startdate,convert(varchar(4),year(@startdate))+'-'+convert(varchar(2),month(@startdate))+'-'+convert(varchar(2),day(@startdate))+' 17:30')    

 end    

end    

if(datepart(dw,@enddate)>1 and datepart(dw,@enddate)<7)   

 begin     

if(datediff(mi,convert(varchar(4),year(@enddate))+'-'+convert(varchar(2),month(@enddate))+'-'+convert(varchar(2),day(@enddate))+' 08:30',@enddate)>0)    

 begin           

 set @delayday=@delayday+datediff(mi,convert(varchar(4),year(@enddate))+'-'+convert(varchar(2),month(@enddate))+'-'+convert(varchar(2),day(@enddate))+' 08:30',@enddate)     

end    

end   

end  

return @delayday     END

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值