/**
* 预存给定日期段的所有日期,包括工作日、普通周末假日、法定节假日
* @beginDt 起日期
* @endDt 止日期
*/
CREATE PROC generateDateList
(
@beginDt datetime
,@endDt datetime
)
AS
BEGIN
--========变量声明========--
DECLARE
--位于起止时间之间的时间变量
@dtDuring datetime
,@dayOfWeekNum int
,@sql nvarchar(4000)
,@batchCount int
,@holidayDateVal datetime
,@holidayDateDesc nvarchar(100)
--=========初始化=========--
SET @dtDuring = @beginDt
SET @batchCount = 0
SET @sql = 'DELETE FROM date_list '
--=========根据当前是否为工作日插入不同数据=========--
WHILE @dtDuring <= @endDt
BEGIN
--清空旧数据
SET @holidayDateVal = NULL
SELECT @holidayDateVal = date_value,@holidayDateDesc = date_desc
FROM holiday_list WHERE date_value = @dtDuring
--计算法定节假日数据
IF @holidayDateVal IS NOT NULL
BEGIN
SET @sql = @sql + 'insert date_list(date_value,is_holiday,date_desc) values(''' + CAST(@dtDuring AS varchar) + ''',''1'',''' + @holidayDateDesc + ''') '
END
--计算非法定节假日(包括平常日期和普通周末假日)
ELSE
BEGIN
--一周内的星期几(从星期日算起,星期一时返回2)
SET @dayOfWeekNum = datePart(dw,@dtDuring);
--如果是工作日,则字段is_holiday为0
IF 1 < @dayOfWeekNum AND @dayOfWeekNum < 7
BEGIN
SET @sql = @sql + 'insert date_list(date_value,is_holiday,date_desc) values(''' + CAST(@dtDuring AS varchar) + ''',''0'',''工作日'') '
END
--如果是节假日,则根据节假日的类型(非法定)插入相应数据
ELSE
BEGIN
SET @sql = @sql + 'insert date_list(date_value,is_holiday,date_desc) values(''' + CAST(@dtDuring AS varchar) + ''',''1'',''普通周末假日'') '
END
END
--设置批量更新的数目(以防止因@sql长度不够而出错)
SET @batchCount = @batchCount + 1
--更新数据(即插入)
IF @batchCount % 30 = 0
BEGIN
EXECUTE sp_executesql @sql
--清空@sql变量
SET @sql = ''
END
--日期加1
SET @dtDuring = dateAdd(day,1,@dtDuring);
END
--最后更新剩余的sql语句
EXECUTE sp_executesql @sql
END
GO
/**
* 计算给定时间段内的剩余工作日数
* @beginDt 起日期
* @endDt 止日期(不纳入“已逝日期”内,即该日期当作是“未来日”)
* @workDateCountGiven 给定工作日数
*/
CREATE FUNCTION getLeaveWorkDateCount
(
@beginDt datetime
,@endDt datetime
,@workDateCountGiven int
)
RETURNS int
AS
BEGIN
DECLARE
@elapsedDateCount int
,@holidayCount int
,@elapsedWorkDateCount int
SET @holidayCount = 0
SET @elapsedDateCount = datediff(day,@beginDt,@endDt)
--计算该日期段内的节假日(包括法定与非法定)数,不含止日期(打多是当天)
SELECT @holidayCount = count(*)
FROM date_list
WHERE @beginDt <= date_value AND date_value < @endDt AND is_holiday = '1'
--已逝工作日数=已逝天数-该段日期内的节假日数
SET @elapsedWorkDateCount = @elapsedDateCount - @holidayCount
IF @elapsedWorkDateCount < 0
SET @elapsedWorkDateCount = 0
--剩余工作日数= 给定工作日数-已逝工作日数
RETURN @workDateCountGiven - @elapsedWorkDateCount
END
GO