2016-04-16 18 views
2

SQL Server 2014Erzeugt alle Daten zwischen zwei

ich in einer Tabelle gespeicherten Daten müssen alle Daten zwischen den Start- und Enddaten aus einer Tabelle #data zu erzeugen. Tabelle #data enthält mehrere Zeilen mit Start- und Enddatum.

CREATE TABLE #data (
    StartDate DATE NOT NULL, 
    EndDate DATE NOT NULL, 
    Opt INT NOT NULL) 

insert into #data values('2016-04-10', '2016-04-12', 2) 
insert into #data values('2016-04-10', '2016-04-15', 3) 
insert into #data values('2016-05-10', '2016-05-12', 4) 

Tabelle #Daten können Hunderte von Zeilen enthalten.

Meine endgültige Auswahl muss folgende Angaben enthalten:

2016-04-10 2 
2016-04-11 2 
2016-04-12 2 
2016-04-10 3 
2016-04-11 3 
2016-04-12 3 
2016-04-13 3 
2016-04-14 3 
2016-04-15 3 
2016-05-10 4 
2016-05-11 4 
2016-05-12 4 

ich zur Zeit dazu haben, aber ich habe die Auswahl für alle Zeilen in #data erweitern:

DECLARE @StartDateTime DATETIME 
DECLARE @EndDateTime DATETIME 

SET @StartDateTime = '2015-01-01' 
SET @EndDateTime = '2015-01-12'; 

--delete from #tmp 

;WITH DateRange(DateData) AS 
(
    SELECT @StartDateTime as Date 
    UNION ALL 
    SELECT DATEADD(d,1,DateData) 
    FROM DateRange 
    WHERE DateData < @EndDateTime 
) 
INSERT INTO #tmp SELECT DateData, 1 -- instead of 1 shall be Opt 
FROM DateRange 
OPTION (MAXRECURSION 0) 

select * from #tmp 

Danke.

Antwort

3

Vielleicht möchten Sie das?

;WITH DateRange(DateData, EndDate, Opt) AS 
(
    SELECT StartDate, EndDate , Opt FROM #data 
    UNION ALL 
    SELECT DATEADD(d,1,DateData), EndDate, Opt 
    FROM DateRange 
    WHERE DateData < EndDate 
) 
SELECT DateData, Opt 
FROM DateRange 
ORDER BY opt, DateData 
OPTION (MAXRECURSION 0) 

Ich würde jedoch in Betracht ziehen, eine geeignete Kalendertabelle zu erstellen. Wenn Sie einen hatten, könnten Sie das gewünschte Ergebnis viel effizienter erreichen (indem Sie Joins mit der Kalendertabelle verwenden).

Sehen Sie diese Artikel für Beispiele und weitere Informationen:

http://www.sqlservercentral.com/blogs/dwainsql/2014/03/30/calendar-tables-in-t-sql/

https://www.mssqltips.com/sqlservertip/4054/creating-a-date-dimension-or-calendar-table-in-sql-server/

+0

Diese Abfrage ist Teil eines größeren, der häufig ausgeführt wird und zeitkritisch ist. Ich habe keinen Kalendertisch, denkst du, ich werde einen unter diesen Umständen haben? Soll die Kalendertabelle eine normale/statische Tabelle sein? Vielen Dank. –

+0

@MihaiHangiu Wenn Sie diese Art der Abfrage häufig und/oder mit großen Datensätzen dann definitiv ja. Die Artikel, mit denen ich verlinkt bin, erklären das Konzept und die Anwendungsfälle im Detail. Es ist im Grunde eine statische Tabelle mit Daten und Informationen zu Daten. – jpw

1

Versuchen Sie, diese

;WITH DateRange 
AS 
(
    SELECT Startdate, Enddate, Opt from #data 
    UNION ALL 
    SELECT DATEADD(d,1,Startdate), Enddate, Opt 
    FROM DateRange 
    WHERE Startdate < Enddate 
) 
SELECT Startdate, Opt 
FROM DateRange 
Order by Opt 

Ergebnis

Startdate Opt 
--------------- 
2016-04-10 2 
2016-04-11 2 
2016-04-12 2 
2016-04-10 3 
2016-04-11 3 
2016-04-12 3 
2016-04-13 3 
2016-04-14 3 
2016-04-15 3 
2016-05-10 4 
2016-05-11 4 
2016-05-12 4 
Verwandte Themen