sql-server-2008 - 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。
解决方案
我会使用 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
我还会确保始终指定表的架构。
推荐阅读
- linux - 无法在 redhat 中使用 yum 安装 libxml2-2.9.1-6.el7_2.3.x86_64
- r - 根据出现返回行的长度
- gradle - 使用 Gradle 时 Cucumber 测试结果的 Cyrillic 输出错误
- nlp - 使用 nlp 回答大型语料库中的定制问题
- angular - 反应形式的角度退订
- python - 我们如何在 pyspark 中使用 dense_rank() 函数?
- r - R上的Plotly Dash - 如何更改标题字符字体
- html - Html 输出加载时间过长
- xml - XSD 到 XML 转换器
- javascript - Echobot 在 Line 上不起作用(不响应消息)