2016-04-03 5 views
-5

現在SSISを使用しています。私は2列の開始日と終了日を持つテーブルを持っています。その間の曜日(開始日と終了日を含む)を計算し、他のデータを繰り返して毎日の行を生成する必要があります。結果の日付は新しい列に格納する必要があります。2つの日付の差を計算し、各エントリの新しい行を生成します。

enter image description here

+2

ようになるはずです。 – artm

+0

ソースは上記のスクリーンショットに示されているような列を持つ表であることを示します。このSQL Serverですか?もしそうなら、どのバージョン(2005、2008、2012、2014、2016)を使用していますか? – billinkc

+0

「間の日数」? "結果の日付"?あなたが求めていることは明確ではありません。 –

答えて

0

この作品を作るためのコツは、可能な範囲内にあるすべての日のリストを含むテーブルを持つことです。

次のクエリでは、私たちのセットMIN(Start)の中で最も小さい日付を使用して偽装します。

次にsys.all_columnsビューの列数に基づいて1からNまでの数値のシーケンスを生成します。これで十分かもしれませんが、それはデータの不足に基づいているかもしれませんが、今のところうまくいきます。より多くの日付を生成する必要がある場合は、sys.all_coumnsテーブル自体にCROSSが適用されます。

私はその後を経由して、日付のリストを構築するために生成された番号を使用し

dateadd

Iその後、私のALLDATES派生テーブルを取り、開始と終了の列の間ALLDATESのために生成日付をピン留め、INNERが元のテーブルにJOINを行います(終点を含む)。

CREATE TABLE dbo.so_36392684 
(
    WeekNo int NOT NULL 
, Start datetime NOT NULL 
, [End] datetime NOT NULL 
, SpecialEvents varchar(20) NULL 
); 

INSERT INTO 
    dbo.so_36392684 
(WeekNo, Start, [End], SpecialEvents) 
VALUES 
(
    1 
, '1989-09-14' 
, '1989-09-20' 
, NULL 
); 


SELECT 
    S.WeekNo 
, S.Start 
, S.[End] 
, S.SpecialEvents 
, ALLDATES.ConsecutiveDays 
FROM 
    (
     SELECT 
      DATEADD(DAY, D.rn, S.Start) AS ConsecutiveDays 
     FROM 
      (
       -- Find the first date in our table 
       SELECT 
        MIN(S.Start) AS Start 
       FROM 
        dbo.so_36392684 AS S 
      ) AS S 
      CROSS APPLY 
      (
       -- Generate a (hopefully) sufficiently large enough set of dates 
       SELECT 
        ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) -1 AS rn 
       FROM 
        sys.all_columns AS AC 
      ) D 
    ) AS ALLDATES 
    INNER JOIN 
     dbo.so_36392684 AS S 
     ON ALLDATES.ConsecutiveDays >= S.Start 
     AND ALLDATES.ConsecutiveDays <= S.[End]; 

結果は、あなたが希望出力に含まを表示する必要があり、この

WeekNo Start  End   SpecialEvents ConsecutiveDays 
1  1989-09-14 1989-09-20 NULL   1989-09-14 
1  1989-09-14 1989-09-20 NULL   1989-09-15 
1  1989-09-14 1989-09-20 NULL   1989-09-16 
1  1989-09-14 1989-09-20 NULL   1989-09-17 
1  1989-09-14 1989-09-20 NULL   1989-09-18 
1  1989-09-14 1989-09-20 NULL   1989-09-19 
1  1989-09-14 1989-09-20 NULL   1989-09-20 
関連する問題