SQL Server基于dimCalendar表的工作日计算自定义函数开发
修复后的SQL Server工作日计算函数
原代码存在硬编码覆盖参数、循环逻辑语法错误且效率低下、未正确累加工作日总数等问题。基于你的需求,以下是正确的实现:
CREATE FUNCTION [udf_WorkingDays] ( @StartDate DATETIME, @EndDate DATETIME ) RETURNS INT AS BEGIN -- 处理起始日期大于结束日期的异常情况,返回0 IF @StartDate > @EndDate RETURN 0; DECLARE @TotalDays INT; -- 直接查询维度表中日期范围内的工作日总数 SELECT @TotalDays = SUM(WorkingDay) FROM [XS].[dimCalendar] WHERE [Date] >= @StartDate AND [Date] <= @EndDate; -- 如果没有匹配的日期(比如超出2020-2040范围),返回0 RETURN ISNULL(@TotalDays, 0); END;
关键说明:
- 保留传入的
@StartDate和@EndDate参数,不再硬编码固定值,确保函数可复用任意日期范围。 - 利用
SUM(WorkingDay)直接计算工作日总数:因为WorkingDay是0(非工作日)或1(工作日),求和结果就是两个日期之间的工作日数量,避免了低效的循环遍历。 - 增加异常处理:起始日期晚于结束日期时直接返回0,避免无效查询;用
ISNULL处理超出维度表日期范围的情况,确保返回合法值。 - 逻辑简洁高效,利用维度表预存数据直接统计,比循环写法性能提升显著,尤其适用于日期范围较大的场景。
内容的提问来源于stack exchange,提问作者Ingenious
相关产品推荐
相关产品推荐

