2010-11-18 8 views
0

Ich habe eine Tabelle ein einzelnes Datum Spalt sagt besonderes Datum (gespeichert als yyyymmdd) mitSQL-Abfrage erstellen Datumsbereich mit einzelnen Datumsspalten

Wie erstelle ich einen Datumsbereich unter der kleinen Teilmenge von Zeilen?

Beispiel Tabelle enthält eine Datumsspalte mit folgenden Werten: 01-Jan-2010 01-feb-2010, 01-mar-2010

I

brauchen
01-jan-2010 - 01-feb-2010 
01-feb-2010 - 01-mar-2010 

.... .. ..

Bitte helfen.

+0

Ich bin mir nicht sicher, ob ich folge was du willst. Wollen Sie sagen, dass in Ihrer Beispieltabelle drei Daten enthalten sind und Sie eine Select-Anweisung wünschen, die vier zurückgibt, wobei "20100201" einmal wiederholt wird? –

+0

Ich denke, die Idee ist, dass die Ausgabe den Datumsbereich für ein Special anzeigt, wobei das Enddatum das Startdatum des nächsten Specials ist. Sie sollten erwägen, zwei Spalten Start-Datum, End-Datum zu haben, da es das Leben so viel einfacher macht und viel erweiterbarer ist ... was passiert, wenn Sie zwei Dinge gleichzeitig haben? – Rob

Antwort

2

Sie können

StartDate     EndDate 
2010-01-01 00:00:00.000 2010-02-01 00:00:00.000 
2010-02-01 00:00:00.000 2010-03-01 00:00:00.000 

so etwas wie

DECLARE @Table TABLE(
     DateVal DATETIME 
) 

INSERT INTO @Table SELECT '01 Jan 2010' 
INSERT INTO @Table SELECT '01 Feb 2010' 
INSERT INTO @Table SELECT '01 Mar 2010' 

;WITH DateVals AS (
    SELECT *, 
      ROW_NUMBER() OVER(ORDER BY DateVal) RowID 
    FROM @Table 
) 
SELECT s.DateVal StartDate, 
     e.DateVal EndDate 
FROM DateVals s INNER JOIN 
     DateVals e ON s.RowID + 1 = e.RowID 

Output versuchen können Sie den CTE vermeiden, indem

SELECT s.DateVal StartDate, 
     MIN(e.DateVal) EndDate 
FROM @Table s LEFT JOIN 
     @Table e ON s.DateVal < e.DateVal 
GROUP BY s.DateVal 
HAVING MIN(e.DateVal) IS NOT NULL 

mit Aber ich sehe nicht, warum Sie dies wünschen.

+0

Gibt es eine Möglichkeit, CTE zu vermeiden? – SumSang

+0

CTE sind nicht schlecht? Kann für eine Anfängerfrage entschuldigen – SumSang

Verwandte Themen