在SQL Server表中添加固定天数到日期列并确定周末

时间:2015-12-12 14:46:09

标签: sql sql-server date

我在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

但我无法弄清楚如何将它用于我的用例。请指导我这个。

提前感谢您提供的帮助。

1 个答案:

答案 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语法而不是重复的子查询。虽然这是非标准的,但它有很多怪癖,这使得它成为一件好事。优化器可能仍然可以对其进行排序。

现在,如果您需要通过各个国家/地区的动态周末日计算,您需要在某处查找该数据。如果您找不到通用解决方案,它还可能取决于您服务器的区域设置。

您可能更喜欢更强大的内容,但一个简单的选择是假设您将WeekendDay1WeekendDay2列添加到使用美国日编号和服务器设置{{1}的Table1匹配。

@@datefirst