带国家法定假日,调休情况下,计算两个日期的工作时间差

数据库:表HolidayTable  字段

holidayName 假期名称;

holidayType 假期类型(我在界面上进行了限制,只存在三种字符串:其它,国家法定假日,调休);

holidayState 假期状态(0,1 0:表示休假,1表示上班);

beginTime(DateTime) 假期开始日期

endTime(DateTime)假期结束日期

时间差计算:

1.两个日期在同一星期中吗?直接计算(除去法定假日,应该上班但holidayState 为0,周末应该休息但holidayState 为1):【(总天数-第一个星期工作天数-最后一个星期工作天数)/7*5+第一个星期的工作天数+加上最后一个星期的工作天数-工作日休假天数+周末加班天数】

SqlServer数据库的几个时间函数简介:

 datepart();这个函数有一个漏洞;比如计算2010-1-1与2011-1-1是否是同一个星期,datepart(wk,'2011-1-1')-datepart(wk,'2010-1-1') ==0;也就是说年份并未参与计算,(事实证明,SqlServer真心做的不行),对于在某工序停留时间超过一年的就直接在界面设置超大的值,从而不去调用存储过程,当然可以继续优化判断两个时间是否是同一年

datediff();

存储过程:

if

(object_id('CalculateDays', 'P') is not null)

drop proc proc_getStudentRecord

go

create

procedure CalculateDays

@beginTime datetime,

@endTime datetime,

@days int output

as

select @days =

--

CASE WHEN DATEPART(wk,@endTime)- DATEPART(wk, @beginTime)= 0 THEN

--

CASE WHEN DATEPART(dw, @beginTime) > 6 THEN 0

--

WHEN DATEPART(dw, @endTime) > 6  and DATEPART(DW,@beginTime)>1 THEN 7 - DATEPART(dw, @beginTime)

--

WHEN DATEPART(DW,@beginTime)<THEN DATEPART(dw, @endTime) - (DATEPART(dw, @beginTime)+1)

--

WHEN DATEPART(DW,@endTime)<THEN 0

ELSE DATEPART(dw, @endTime) - DATEPART(dw, @beginTime)+1

END

--

ELSE (DATEDIFF(day,@beginTime,@endTime) -(7- DATEPART(dw,@beginTime)) - DATEPART(dw,@endTime)) / 7 * 5

--

+ CASE when DATEPART(DW,@beginTime)<then 5

WHEN DATEPART(dw, @beginTime) < 7 THEN 7 - DATEPART(dw, @beginTime)

ELSE 0

END

--

+ CASE WHEN DATEPART(dw, @endTime)>THEN 5

when DATEPART(dw, @endTime)<then 0

ELSE DATEPART(dw, @endTime) -1

END

END

 

 

 

 


 

 

posted @ 2015-11-18 14:41  科泰  阅读(680)  评论(0编辑  收藏  举报