在 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。
您好,根据当前声明,我正在根据以下声明更新 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。