数据库:表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)<2 THEN DATEPART(dw, @endTime) - (DATEPART(dw, @beginTime)+1)
--
WHEN DATEPART(DW,@endTime)<2 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)<2 then 5
WHEN DATEPART(dw, @beginTime) < 7 THEN 7 - DATEPART(dw, @beginTime)
ELSE 0
END
--
+ CASE WHEN DATEPART(dw, @endTime)>6 THEN 5
when DATEPART(dw, @endTime)<2 then 0
ELSE DATEPART(dw, @endTime) -1
END
END
原文:http://www.cnblogs.com/ketai/p/4974466.html