200字范文,内容丰富有趣,生活中的好帮手!
200字范文 > 预存给定日期段的所有日期 包括工作日 普通周末假日 法定节假日

预存给定日期段的所有日期 包括工作日 普通周末假日 法定节假日

时间:2019-03-28 06:35:54

相关推荐

预存给定日期段的所有日期 包括工作日 普通周末假日 法定节假日

/**

* 预存给定日期段的所有日期,包括工作日、普通周末假日、法定节假日

* @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

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。