`
joerong666
  • 浏览: 409974 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

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

阅读更多

/**
* 预存给定日期段的所有日期,包括工作日、普通周末假日、法定节假日
* @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

  • 大小: 15.4 KB
  • 大小: 28.5 KB
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics