微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

工作天数和时间计算

create table tv_holiday(
HDate smalldatetime primary key clustered,
Name nvarchar(50) not null
)


指定时间段内的工作天数
create function f_Workday_thr(
@dt_begin datetime,
@dt_end datetime
) returns int
as
begin
if @dt_begin > @dt_end
return (datediff(day,@dt_begin,@dt_end) + 1 -
(
select COUNT(*) from tb_holiday where Hdate between @dt_begin and @dt_end
))
return (
-(datediff(day,@dt_end) + 1 -
(select COUNT(*) from tb_Holiday 
where HDate between @dt_end and @dt_begin
)))
end


指定日期加上工作天数
create function f_workdayAdd_four(
@date datetime,
@workday int
) returns datetime
as
begin
if @workday > 0 
while @workday > 0
select @date = @date + @workday,@workday = COUNT(*) from tb_holiday
where HDate between @date and @date + @workday
else
while @workday < 0
select @date = @date + @workday,@workday = -COUNT(*) from tb_holiday
where HDate between @date and @date + @workday


return (@date)
end


计算工作时间的函数

if exists(select * from sysobjects where id = OBJECT_ID(N'[tb_worktime]') and OBJECTPROPERTY(id,N'IsUserTable') = 1) drop table [tb_worktime] go create table tb_worktime( ID int identity(1,1) primary key,time_start smalldatetime,time_end smalldatetime,worktime as datediff(minute,time_start,time_end) ) go if exists(select * from sys.sysobjects where id = OBJECT_ID(N'[dbo.f_wroktime]') and xtype in (N'FN',N'IF',N'TF')) drop function [dbo].[f_worktime] go --计算两个日期之间的工作时间 create function f_worktime( @date_begin datetime,@date_end datetime ) returns int as begin declare @worktime int if DATEDIFF(day,@date_begin,@date_end) = 0 select @worktime = SUM(datediff(minute,case when convert(varchar,108) > time_start then convert(varchar,108) else time_start end,case when CONVERT(varchar,@date_end,108) < time_end then convert(varchar,108)  else time_end end)) from tb_worktime where time_end > CONVERT(varchar,108) and time_start < CONVERT(varchar,108) else set @worktime = (select SUM(case when convert(varchar,108) > time_start  then datediff(minute,convert(varchar,108),time_end) else worktime end) from tb_worktime where time_end > CONVERT(varchar,108)) +(select SUM(case when CONVERT(varchar,108)< time_end then datediff(minute,108)) else worktime end) from tb_worktime where time_start < convert(varchar,108)) + case when datediff(day,@date_end) > 1 then (datediff(day,@date_end) - 1) * (select SUM(worktime) from tb_worktime) else 0 end return(@worktime) end

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐