我在SQL Server中有一个表,比如表1,如下所示:
Location No:of Days
Timbuktu 7
Valhalla 5
Spain 20
此表列出了具有投放到这些位置的天数的位置。
我有另一张桌子,表2如下:
Location Part Ready_To_Ship_Date Estimated_Delivery_Date
Valhalla XXXX 26-Dec-15
Spain YYYY 01-Jan-16
Valhalla ZZZZ 15-Jan-16
Timbuktu AAAA 15-Dec-15
现在,我需要将表1中给出的位置的天数添加到表2中该位置的记录的相应Ready_To_Ship日期,获取Estimated_Delivery_Date并检查交付日期是否在星期六或星期日。如果是,则将日期作为下一个星期一。对于一些地方,这将是周五和周六,因为你们都知道世界各地的周末都不一样。
我在SO中找到了这个帖子:With SQL Server add x number of days to a date in sql but also pass in the number of business days in a week
但我无法弄清楚如何将它用于我的用例。请指导我这个。
提前感谢您提供的帮助。
答案 0 :(得分:1)
你可以采取两步走的方法。不是最有效的,但它可能对你来说足够好。更改第二次更新中的值以对应您所需的周末天数:
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()
处理Table1中的失败查找。我不会得到你会遇到这个问题的印象。
另请注意,有些人会在更新中使用inner join
语法而不是重复的子查询。虽然这是非标准的,但它有很多怪癖,这使得它成为一件好事。优化器可能仍然可以对其进行排序。
现在,如果您需要通过各个国家/地区的动态周末日计算,您需要在某处查找该数据。如果您找不到通用解决方案,它还可能取决于您服务器的区域设置。
您可能更喜欢更强大的内容,但一个简单的选择是假设您将WeekendDay1
和WeekendDay2
列添加到使用美国日编号和服务器设置{{1}的Table1
匹配。
@@datefirst