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
相关产品推荐
相关产品推荐

