2017-08-11 38 views
0

我必須生成一個包含所有非營業日和其下一個工作日的表格。計算幾年的下一個工作日

鑑於: 表格存儲某些城市的週末。

CREATE TABLE WeekHolidays 
(
    CitiesId int 
,Cities_Name varchar(50) 
,HolidayDate int 
) 

另一臺舉行公衆假期:

CREATE TABLE Holidays 
(
    CitiesId int 
    ,Cities_Name varchar(50) 
    ,HolidayDate datetime 
) 

目前,我產生了週末在未來2047周(近40年)+加上公共假日,如:

SELECT Cities_Id 
      ,Cities_Name 
      ,DATEADD(WEEK,sptv.number,DATEADD(DAY,(((HolidayDate - 1) + 7) %7),DATEADD(week, DATEDIFF(day, 0, getdate())/7, 0))) as HolidayDate 
     FROM WeekHolidays 
    CROSS JOIN master..spt_values sptv 
     WHERE sptv.type = 'P' 
    UNION 
    SELECT Cities_Id 
      ,Cities_Name 
      ,HolidayDate 
     FROM Holidays 

但現在我需要爲每個日期添加logik的下一個工作日:向前滾動到不在此表中的第一天(對於每個城市)。

Rextester重現: http://rextester.com/OZTT34904

所以結果應該是這樣的:

CitiesId Cities_Name HolidayDate  NextBusinessDay 
3   PARIS   14.07.2017  17.07.2017 
3   PARIS   15.07.2017  17.07.2017 
3   PARIS   16.07.2017  17.07.2017 
3   PARIS   22.07.2017  24.07.2017 
3   PARIS   23.07.2017  24.07.2017 
3   PARIS   29.07.2017  31.07.2017 
3   PARIS   30.07.2017  31.07.2017 
3   PARIS   05.08.2017  07.08.2017 
3   PARIS   06.08.2017  07.08.2017 
3   PARIS   12.08.2017  14.08.2017 
3   PARIS   13.08.2017  14.08.2017 
3   PARIS   15.08.2017  16.08.2017 
3   PARIS   18.08.2017  21.08.2017 
3   PARIS   19.08.2017  21.08.2017 
3   PARIS   20.08.2017  21.08.2017 
3   PARIS   26.08.2017  28.08.2017 
3   PARIS   27.08.2017  28.08.2017 

在例如:HolidayDate = 2017年7月14日的下一個BusinessDay將是2017年7月17日,爲15.07。 & 16.07。都包含在HolidayDate列中(星期日&星期日是巴黎的假期)。

我希望現在它更容易理解。

任何想法如何輕鬆快速地解決這個問題?

在此先感謝! 斯特凡

+1

爲什麼週末和在不同的表公衆假期區分。如果是假期,那是假期。如果你真的需要區分,只需添加一個列節點類型或其他東西。至少應該簡化你的結構。 – ADyson

+0

[這可能會爲您節省大量時間](https://www.mssqltips.com/sqlservertip/4054/creating-a-date-dimension-or-calendar-table-in-sql-server/)它計算平日,節假日等......你可以爲自己的假期輕微編輯亞倫的方法 – scsimon

+0

這些表格是由系統給出的。我不太喜歡它,但我必須應付它。其遺留系統 –

回答

0

你可以試試這個:

with getstarts as (
select mydays.* 
    -- transform the dates to have weekends day as 6 and 7 
    ,case when DATEPART(weekday, Holiday) =1 then 7 
     else DATEPART(weekday, Holiday)-1 end as weekdays 
    FROM (
     YOUR_TABLE 
    ) mydays 
) 

SELECT g.*, DATEADD(day,8-g.weekdays,g.Holiday) as c 
FROM getstarts AS g 
where g.weekdays between 6 and 7 
order by holiday 

我轉變的日期有被週一的一週的第一天。然後,我通過添加缺少天

要創建包含日期的表計算的日期都一起來看看這款漂亮的內聯表值函數 https://stackoverflow.com/a/30133693/8302316