2016-04-03 19 views
-5

Şu anda SSIS üzerinde çalışıyorum. İki sütunlu Başlangıç ​​ve Bitiş tarihleri ​​içeren bir tablom var. Aradaki günleri (başlangıç ​​tarihi ve bitiş tarihi dahil) hesaplamalı ve diğer veriler tekrarlanarak her gün için bir satır oluşturmam gerekiyor. Ortaya çıkan tarihler yeni bir sütunda depolanmalıdır.iki tarih arasındaki farkı hesaplar ve her giriş için yeni satır oluşturur

enter image description here

+2

gibi görünmelidir. – artm

+0

Kaynak, yukarıdaki ekran görüntüsünde belirtildiği gibi sütunları olan bir tabloyu belirtirsiniz. Bu SQL Server mı? Eğer öyleyse, hangi sürümü kullanıyorsunuz (2005, 2008, 2012, 2014, 2016)? – billinkc

+0

"arası günler arası"? "sonuç tarihleri"? Ne istediğin belli değil. –

cevap

0

bu işi yapmaya hüner mümkün aralığındaki tüm günler listesini içeren bir tablo sahip olmaktır.

Aşağıdaki sorguda, MIN(Start) kümemizin en küçük tarihini kullanarak bunu fake ediyorum.

Daha sonra sys.all_columns görünümlerimizdeki sütun sayısına bağlı olarak 1'den N'ye kadar bir sayı dizisi oluşturuyorum. Bu yeterli olabilir, ancak veri azlığına dayanarak, şimdilik işe yarıyor olabilir. Oluşturulan daha fazla aramaya ihtiyacınız varsa, Sys.all_coumns tablosunu kendiliğinden AÇINIZ.

Sonra aracılığıyla tarihlerin bir liste oluşturmak için oluşturulan numaralarını kullanabilirsiniz

dateadd

o zaman benim ALLDATES türetilmiş tablo almak ve Başlangıç ​​ve Bitiş sütunları arasında ALLDATES için oluşturulan tarihini iğneleme, bir INNER orijinal tabloya JOIN gerçekleştirmek (son noktalar dahil).

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]; 

Sonucu İstediğiniz çıkışını göstermek gerekir bu

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 
İlgili konular