嗨,根據當前宣告,我正在按照以下宣告更新表中的日期。我想更新不超過今天的日期。如果日期將超過今天的日期,那么它將更新為今天的日期。
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。
uj5u.com熱心網友回復:
我會使用 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我還會確保始終指定表的架構。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/313211.html
