基于工作日的工时顺延SQL实现方案问询(前端开发者)
基于工作日的日期工时累加解决方案
要实现给指定日期添加工时后自动顺延至工作日的需求,可通过"先计算初始累加结果,再判断是否为周末并调整"的逻辑实现。以下是针对SQL Server的具体解决方案:
核心实现代码
DECLARE @Date datetime = '2023-04-07 23:15:50.720'; DECLARE @AddHours int = 3; -- 计算添加工时后的初始日期 DECLARE @CalculatedDate datetime = DATEADD(HOUR, @AddHours, @Date); -- 根据周末情况调整至下一个工作日 SELECT CASE -- 若结果为周六,顺延2天至周一 WHEN DATENAME(dw, @CalculatedDate) = 'Saturday' THEN DATEADD(DAY, 2, @CalculatedDate) -- 若结果为周日,顺延1天至周一 WHEN DATENAME(dw, @CalculatedDate) = 'Sunday' THEN DATEADD(DAY, 1, @CalculatedDate) -- 工作日直接返回初始计算结果 ELSE @CalculatedDate END AS AdjustedWorkDate;
逻辑说明
- 初始计算:先用
DATEADD(HOUR, @AddHours, @Date)得到单纯累加工时后的日期,示例中会得到2023-04-08 02:15:50.720(周六)。 - 周末判断:通过
DATENAME(dw, ...)获取日期对应的星期名称,不受DATEFIRST系统设置影响,能准确识别周六和周日。 - 日期调整:周六需加2天跳至下周一,周日需加1天跳至下周一,工作日则直接返回初始结果。
运行上述代码后,示例的输出将符合预期:2023-04-10 02:15:50.720
兼容DATEFIRST设置的替代写法
如果你的SQL Server实例修改过DATEFIRST(比如将周一设为每周第一天),也可以用DATEPART结合偏移判断,避免星期编号变化的影响:
DECLARE @Date datetime = '2023-04-07 23:15:50.720'; DECLARE @AddHours int = 3; DECLARE @CalculatedDate datetime = DATEADD(HOUR, @AddHours, @Date); -- 统一转换为周一=1、周日=7的星期编号 DECLARE @WeekDay int = (DATEPART(dw, @CalculatedDate) + @@DATEFIRST - 2) % 7 + 1; SELECT CASE WHEN @WeekDay = 6 THEN DATEADD(DAY, 2, @CalculatedDate) -- 周六 WHEN @WeekDay = 7 THEN DATEADD(DAY, 1, @CalculatedDate) -- 周日 ELSE @CalculatedDate END AS AdjustedWorkDate;
内容的提问来源于stack exchange,提问作者Nelson
相关产品推荐
相关产品推荐

