You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于工作日的工时顺延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;

逻辑说明

  1. 初始计算:先用DATEADD(HOUR, @AddHours, @Date)得到单纯累加工时后的日期,示例中会得到2023-04-08 02:15:50.720(周六)。
  2. 周末判断:通过DATENAME(dw, ...)获取日期对应的星期名称,不受DATEFIRST系统设置影响,能准确识别周六和周日。
  3. 日期调整:周六需加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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 00:47:31