根据时间段,返回时间段的工作小时数
2008-06-24 11:36
302 查看
/* 根据时间段,返回时间段的工作小时数:一天按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
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
相关文章推荐
- 根据开始时间和结束时间返回时间段内的时间集合
- 根据开始时间和结束时间返回时间段内的时间集合
- node里面连接mongodb查询返回一天的数据(根据时间段查询)
- java 根据开始日期 ,需要的工作日天数 ,计算工作截止日期,并返回截止日期
- 每日学习总结:根据给定的时间段,返回时间段内的月(年/季度)的数组、使用JavascriptSerializer类将DataTable序列化和反序列化
- 根据数据库查询返回值,返回时间段
- 两个时间段差值,返回小时,分钟
- 每日学习总结:根据给定的时间段,返回时间段内的月(年/季度)的数组、使用JavascriptSerializer类将DataTable序列化和反序列化
- java方法,返回两个日期内的所有date集合,根据开始时间、结束时间得到两个时间段内所有的日期
- ORACLE函数返回时间段之间工作日天数(精确到小时)
- Java根据开始时间和结束时间返回时间段内的时间集合
- 第7周项目5 根据员工的工作小时求该员工的周工资
- ORACLE函数返回时间段之间工作日天数(精确到小时)
- orcale 根据时间段统计(分钟,小时,天,月,年)
- 根据秒数返回(天,小时,分钟,秒)
- java方法,返回两个日期内的所有date集合,根据开始时间、结束时间得到两个时间段内所有的日期
- 根据声明变量的类型自动转换方法的返回值类型
- 根据打印机名称返回打印机任务方法
- ErrorCode枚举类型返回错误码信息测试,手动抛出异常信息,在事务中根据错误码来回滚事务的思路。
- ognl表达式根据map拼凑字符串返回