2015-12-12 61 views
0

我有一個表,說表1,在SQL Server中,如下所示:至今列加入天的固定數量的SQL Server表,並確定週末

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 

現在我需要添加的天數在表2中的表1給出的記錄對應的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

Bingle「SQL Server日曆表」。這也可以讓你識別所有非營業日,包括假期。 –

回答

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()表1中的一個失敗的查找。我不知道你會有這個問題。

另請注意,有些人會在更新中使用inner join語法,而不是重複的子查詢。這是非標準的,但它有很多怪癖,這是避免的一件好事。優化器可能仍然可以將它全部整理出來。

現在,如果您需要在各個國家/地區動態地進行週末日計算,則需要在某處查找該數據。如果您沒有找到通用解決方案,它也可以取決於您的服務器的區域設置。

你可能會喜歡的東西更強大的但一個簡單的方法是假設你添加列WeekendDay1WeekendDay2Table1使用美國天編號和匹配的@@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