2010-11-18 180 views
0

我有一個包含一個日期列的表說特殊日期(存儲爲YYYYMMDD)SQL查詢創建的日期範圍與單個日期列

如何創建行的小部分中的日期範圍?

實施例表包含01-JAN-2010,01-FEB-2010,01-MAR-2010

我需要

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

.... 具有以下值的日期列.. ..

請幫忙。

+0

我不知道我按照你想要的。你是說在你的示例表中有三個日期,並且你想要一個select語句返回四個,'20100201'重複一次? – 2010-11-18 08:13:12

+0

我認爲這個想法是,輸出顯示一個特殊的日期範圍,其中結束日期是下一個特殊的開始日期。你應該考慮有兩列開始日期,結束日期,因爲它會使生活變得更簡單和更具可擴展性......如果你有兩件特別的東西,那麼會發生什麼? – Rob 2010-11-18 08:18:11

回答

2

您可以通過使用

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 

嘗試像

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 

輸出

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 

可以避開CTE但我不明白爲什麼你想這樣做。

+0

有什麼辦法可以避免CTE? – SumSang 2010-11-18 08:16:24

+0

CTE不壞?對於初學者問題可能會感到抱歉 – SumSang 2010-11-18 08:54:08