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

SQL Update使用Case语句时如何限制更新日期不超过当日日期

修正后的SQL更新脚本

你可以直接使用以下脚本实现需求,核心逻辑是取原规则计算结果和当日日期的较小值,自动触发「计算值超当日则取当日」的规则:

UPDATE visiting 
SET OriginArrvDate = IIF(
    -- 按原有规则计算目标日期
    CASE
       WHEN DATEPART(weekday,ORDDATE)=6 THEN DATEADD(dd,3,ORDDATE)
       WHEN DATEPART(weekday,ORDDATE)=7 THEN DATEADD(dd,3,ORDDATE)
       WHEN DATEPART(weekday,ORDDATE)=1 THEN DATEADD(dd,2,ORDDATE)
       WHEN DATEPART(weekday,ORDDATE)=2 THEN DATEADD(dd,1,ORDDATE)
       ELSE ORDDATE 
    END > CAST(GETDATE() AS DATE),
    -- 计算值超过当日时返回当日日期
    CAST(GETDATE() AS DATE),
    -- 未超过则返回计算结果
    CASE
       WHEN DATEPART(weekday,ORDDATE)=6 THEN DATEADD(dd,3,ORDDATE)
       WHEN DATEPART(weekday,ORDDATE)=7 THEN DATEADD(dd,3,ORDDATE)
       WHEN DATEPART(weekday,ORDDATE)=1 THEN DATEADD(dd,2,ORDDATE)
       WHEN DATEPART(weekday,ORDDATE)=2 THEN DATEADD(dd,1,ORDDATE)
       ELSE ORDDATE 
    END
)
WHERE orddate >= CONVERT(DATE,DATEADD(dd,-100,GETDATE()))

如果你使用的是SQL Server 2022及以上版本,可以用LEAST函数简化写法,避免重复书写两次CASE逻辑:

UPDATE visiting 
SET OriginArrvDate = LEAST(
    CASE
       WHEN DATEPART(weekday,ORDDATE)=6 THEN DATEADD(dd,3,ORDDATE)
       WHEN DATEPART(weekday,ORDDATE)=7 THEN DATEADD(dd,3,ORDDATE)
       WHEN DATEPART(weekday,ORDDATE)=1 THEN DATEADD(dd,2,ORDDATE)
       WHEN DATEPART(weekday,ORDDATE)=2 THEN DATEADD(dd,1,ORDDATE)
       ELSE ORDDATE 
    END,
    CAST(GETDATE() AS DATE)
)
WHERE orddate >= CONVERT(DATE,DATEADD(dd,-100,GETDATE()))

注意:DATEPART(weekday)的返回值受数据库@@DATEFIRST参数影响,不同配置下周几对应的数字可能存在差异,建议执行前先验证该函数返回值是否符合你的业务规则预期。

内容的提问来源于stack exchange,提问作者A.Goutam

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 05:48:04