2017-08-11 18 views
0

私はすべての非営業日と翌営業日のテーブルを生成する必要があります。数年の翌営業日の計算

与えられたもの: 特定の都市の週末を格納するテーブル。

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

別のテーブル保持祝日:

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 

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

は現在、私は次のように祝日を追加する+次の2047週(約40年)のための週末の日を生成しています

しかし、私はこれらの日付ごとにlogikを使って翌営業日を追加する必要があります。この表にない最初の日に(各都市ごとに)先に進む。

Rextesterを再生する:例で

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 

http://rextester.com/OZTT34904

をその結果は次のようでなければならないHolidayDate = 2017年7月14日次BusinessDayは15.07として、2017年7月17日であろう。 & 16.07。 HolidayDate列(土曜日&日曜日はパリの休日)に含まれています。

私はもっと理解できることを願っています。

これを簡単かつ迅速にどのようにアプローチするか考えてみましょうか?

ありがとうございます! ステファン

+1

を見て含むテーブルを作成するには不足している日に

を追加することにより、日付を計算しています。それが休日の場合、それは休日です。あなたが本当に区別する必要がある場合は、単にHolidayTypeなどの列を追加してください。それは少なくともあなたの構造を単純化するはずです。 – 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 

私は週の1日目であること月曜日持つように日付を変換しています。それから私は別のテーブルに週末と祝日を区別なぜ日付は、この素敵なインラインテーブル値関数 https://stackoverflow.com/a/30133693/8302316

関連する問題