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

编写SQL Server条件存储过程处理重叠预约记录

解决方案:SQL Server批量调整操作员重叠预约时间

核心思路

针对每个操作员的预约记录,按唯一标识排序后分配序号,以原7点开始时间为基准,每条预约依次延后1小时启动,同时严格保留原预约时长,确保调整后的记录无时间重叠,且适配现有工时统计逻辑。这种方式用窗口函数实现,避免游标,性能高效。

存储过程代码

CREATE PROCEDURE dbo.AdjustOperatorAppointments
AS
BEGIN
    SET NOCOUNT ON;

    -- 基于CTE计算调整后的时间,批量更新
    WITH AdjustedAppointments AS (
        SELECT 
            ID,
            OperatorID,
            EntryDatetime,
            ExitDatetime,
            -- 计算原预约时长(分钟)
            DATEDIFF(MINUTE, EntryDatetime, ExitDatetime) AS DurationMins,
            -- 按操作员分组,给每条预约分配顺序号
            ROW_NUMBER() OVER(PARTITION BY OperatorID ORDER BY ID) AS Seq
        FROM dbo.Appointments
        -- 仅处理未调整的原始记录(假设原开始时间都是7点)
        WHERE CAST(EntryDatetime AS TIME) = '07:00:00'
    )
    UPDATE AdjustedAppointments
    SET 
        EntryDatetime = DATEADD(HOUR, Seq - 1, EntryDatetime),
        ExitDatetime = DATEADD(MINUTE, DurationMins, DATEADD(HOUR, Seq - 1, EntryDatetime));
END
GO

关键说明

  • 高效性:使用ROW_NUMBER()窗口函数分组排序,比游标循环效率高得多,不会占用过多服务器资源,适合批量数据处理。
  • 时长保留:通过DATEDIFF提取原时长,再用DATEADD计算新结束时间,完全匹配原预约时长,不影响后续工时统计。
  • 无重叠保障:因为所有预约最长1小时,每条延后1小时启动,前一条的结束时间(7点+时长≤8点)与下一条的启动时间(8点)完全衔接,不会出现重叠。
  • 可扩展性:如果需要调整排序逻辑,只需修改ORDER BY后的字段(比如按导入时间排序);如果要保留原始数据,可在更新前先插入到历史表。

内容的提问来源于stack exchange,提问作者John

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 07:33:20