在 Case 语句更新日期不晚于今天的日期

In Case statement update date not greater than today date

您好,根据当前声明,我正在根据以下声明更新 table 中的日期。我想更新不超过今天的日期。如果日期晚于今天的日期,那么它将更新为今天的日期。

Update visiting 
set OriginArrvDate
       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())) 

在上面的脚本中,我尝试在计算 ( DATEADD(dd,3,ORDDATE) ) 中的日期后,如果输出大于今天的日期,那么它将更新为今天的日期。

示例:ORDATE 为“2021-09-26”,因此根据当前条件 ORDDATE 将为 2021-09-29,但我想要之后的结果计算日期不超过今天日期。所以日期将是“2021-09-27” 如果 ORDATE 计算低于今天的日期,那么它会很好并且不需要更改日期。 感谢您的回复

更新:- 根据建议,我已在 sqlfiddle 上使用脚本添加数据。如果您查看访问 Oid 1 和 5 的 table 的数据。 OriginArrvDate 的两个更新数据都超过了今天的日期。当新的 ordDate 大于当前日期时,我想用今天的日期更新 OriginArrvDate。

我会使用 CTE,通过将 CASE 表达式 (not a CASE statement) 应用于 existing[=26= 的输出,可以非常轻松地测试您的逻辑] CASE表达式。

;WITH x AS
(
   SELECT Oid, ORDDATE, OriginArrvDate,
     CalcDate = CASE DATEPART(weekday, ORDDATE)
       WHEN 6 THEN DATEADD(DAY, 3, ORDDATE)
       WHEN 7 THEN DATEADD(DAY, 3, ORDDATE)
       WHEN 1 THEN DATEADD(DAY, 2, ORDDATE)
       WHEN 2 THEN DATEADD(DAY, 1, ORDDATE)
       ELSE ORDDATE END
   FROM dbo.visiting
   WHERE orddate >= CONVERT(DATE,DATEADD(DAY, -100, getdate()))  
   AND OriginArrvDate IS NULL
)
--SELECT *,
/* -- */ UPDATE x SET 
OriginArrvDate = CASE 
  WHEN CalcDate > GETDATE() THEN GETDATE() 
  ELSE CalcDate END
--FROM x;

感谢 fiddle,但我在这里写了 db<>fiddle 因为我无法让 SQLFiddle 正确显示更新。

除了using DAY instead of dd I would also make sure to always specify a table's schema