您可以採取兩步法。不是最有效的,但它可能對你來說足夠好。更改第二次更新中的值以符合您希望的週末日期:
update Table2
set Estimated_Delivery_Date =
dateadd(
day,
(select "No:of Days" from Table1 t1 where t1.Location = Table2.Location),
Ready_To_Ship_Date
);
update Table2
set Estimated_Delivery_Date =
dateadd(
day,
case
when datepart(weekday, Estimated_Delivery_Date) = 7 then 2
when datepart(weekday, Estimated_Delivery_Date) = 1 then 1
else 0 /* redundant with the where */
end,
Estimated_Delivery_Date
)
where datepart(weekday, Estimated_Delivery_Date) in (1, 7);
這並不是說它不能一步完成;它只是變得更難閱讀:
update Table2
set Estimated_Delivery_Date =
dateadd(
day,
coalesce((select "No:of Days" from Table1 t1 where t1.Location = Table2.Location), 0)
+ case
datepart(weekday, dateadd(
day,
(select "No:of Days" from Table1 t1 where t1.Location = Table2.Location),
Ready_To_Ship_Date
))
when 7 then 2
when 1 then 1
else 0
end,
Ready_To_Ship_Date
)
end
這第二個查詢也處理通過coalesce()
表1中的一個失敗的查找。我不知道你會有這個問題。
另請注意,有些人會在更新中使用inner join
語法,而不是重複的子查詢。這是非標準的,但它有很多怪癖,這是避免的一件好事。優化器可能仍然可以將它全部整理出來。
現在,如果您需要在各個國家/地區動態地進行週末日計算,則需要在某處查找該數據。如果您沒有找到通用解決方案,它也可以取決於您的服務器的區域設置。
你可能會喜歡的東西更強大的但一個簡單的方法是假設你添加列WeekendDay1
和WeekendDay2
到Table1
使用美國天編號和匹配的@@datefirst
服務器設置。
update Table2
set Estimated_Delivery_Date =
dateadd(
day,
coalesce((select "No:of Days" from Table1 t1 where t1.Location = Table2.Location), 0)
+ case
datepart(weekday, dateadd(
day,
(select "No:of Days" from Table1 t1 where t1.Location = Table2.Location),
Ready_To_Ship_Date
))
when (select WeekendDay1 from Table1 t1 where t1.Location = Table2.Location)
then 2
when (select WeekendDay2 from Table1 t1 where t1.Location = Table2.Location)
then 1
else 0
end,
Ready_To_Ship_Date
)
end
Bingle「SQL Server日曆表」。這也可以讓你識別所有非營業日,包括假期。 –