2010-11-18 26 views
0

と日付範囲を作成し、私は単一の日付列を含むテーブルを持っている(YYYYMMDDとして格納されている)特別な日SQLクエリは、単一の日付欄

がどのように私は、行の小さなサブセット間の日付範囲を作成しないと言いますか?

例テーブル01-JAN-2010は、01 - 02月2010年01-MAR-2010

Iは

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

.... を必要とする以下の値を持つ日付列を含みます.. ..

助けてください。

+0

私はあなたが望むものに従うかどうかわかりません。あなたのサンプルテーブルに3つの日付があり、「20100201」を1回繰り返して4を返すselectステートメントが必要だと言っていますか? –

+0

私は、アウトプットは特殊な日付範囲を表示し、それによって終了日が次の特別な日付の開始日であると考えていると思います。あなたは2つの列の開始日、終了日を考慮することで、人生をはるかに単純化し、はるかに拡張可能にすることを考慮する必要があります。 – Rob

答えて

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

+0

CTEは悪くないですか?初心者にはごめんなさい。 – SumSang