首页 > 解决方案 > In Case 声明更新日期不超过今天

问题描述

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

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 的访问表数据。OriginArrvDate 的两个更新数据都超过了今天的日期。当新的 ordDate 大于当前日期时,我想用今天的日期更新 OriginArrvDate。

标签: sql-server-2008stored-procedurescase

解决方案


我会使用 CTE,它可以通过将CASE表达式(而不是CASE语句)应用于现有 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;

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

除了使用DAY而不是,dd我还会确保始终指定表的架构


推荐阅读