2011-10-19 7 views
2

は私のテーブルPRODUCTは3列があります。一覧表の2つのDate列の間のすべての日付

Product_ID 
INTRODUCED_DATE 
WITHDRAWAL_DATE 

私は製品がactive.Theたすべての日付を一覧表示するには、このテーブルから派生テーブルPRODUCT_ALL_DATESを作成する必要があります?

:日付範囲はどのようにSQL Serverでこれを達成することができ、私が添付された画像のサンプル出力を示しているINTRODUCED_DATE(開始日)とWITHDRAWAL_DATE(終了日)

です

ありがとうございます!

+0

[2つの日付の間の日付のリストを取得します]の可能な複製(http://stackoverflow.com/questions/510012/get-a-list-of-dates-between-two-dates) –

+0

チェックアウトの価値:[SQLで2つの指定された日付間のすべての日付を表示する方法](http://stackoverflow.com/questions/1490566/how-to-display-all-the-dates-between-two-given-dates -in-sql) –

答えて

5
declare @dateh table(ind int identity(1,1),date1 smalldatetime,date2 smalldatetime) 

insert into @dateh select '1/1/2011','1/15/2011' 

select * from @dateh 

;with T as 
(
    select date1,date2 from @dateh as d 
    union all 
    select dateadd(dd,1,date1),date2 From T 
    where dateadd(dd,1,date1)<= date2 
) 
Select date1 from T 
+1

再帰が100回以上(より長い日付範囲)実行されると、再帰は終了します。より大きな日付範囲で正しく実行するには、OPTION(MAXRECURSION 0)を最後に追加する必要があります。 –

+0

はいそれに同意します – rahularyansharma

1

私は2番目のテーブル

  • はそれを行うには、別の言語でプログラムを書く移入するthrouhストアドプロシージャとループを書くこの

    1. を達成するための2つの方法を考えることができます。

    なぜこのようにしたいのですか?データが現在の形式では解決できない問題は何ですか?

  • 0

    日付の合計範囲によっては、これが機能するはずです。全体的な日付範囲が広い場合は、MAX再帰を調整する必要があります。

    ;WITH DaysCTE(Date) as 
    (
        SELECT MIN(INTRODUCED_DATE) AS Date FROM PRODUCT 
         UNION ALL 
        SELECT DATEADD(day, 1, Date) 
         FROM DaysCTE 
         where Date < (SELECT MAX(@WITHDRAWAL_DATE) FROM PRODUCT) 
    ) 
    
    SELECT 
        PRODUCT_ID, 
        DaysCTE.Date 
    FROM 
        PRODUCT 
    INNER JOIN DaysCTE 
    ON DaysCTE.Date >= PRODUCT.INTRODUCED_DATE 
        AND DaysCTE.DATE <= PRODUCT.WITHDRAWAL_DATE 
    
    0

    質問の回答は です。私はこれをCursorを使用して試しました。それは正常に動作しています。また

    CREATE TABLE product 
    (
    product_id int 
    ,INTRODUCED_DATE DATETIME 
    ,WITHDRAWAL_DATE DATETIME 
    ) 
    
    INSERT INTO product VALUES (100,'01-01-2011','01-05-2011') 
    INSERT INTO product VALUES (200,'05-30-2011','06-05-2011') 
    
    CREATE TABLE PRODUCT_ALL_DATES 
    (
    product_id int 
    ,Dates_Active DATETIME 
    ) 
    
    DECLARE @product int 
    ,@Introduct_Date DATETIME 
    ,@Withdrawal_date DATETIME 
    ,@Dates_Active DATETIME 
    
    DECLARE pointer_cur CURSOR FAST_FORWARD 
    FOR 
    SELECT * FROM product a 
    
    OPEN pointer_cur 
    
    FETCH NEXT FROM pointer_cur 
    INTO @Product,@Introduct_Date,@Withdrawal_date 
    
    WHILE(@@FETCH_STATUS=0) 
    BEGIN 
    
        WHILE(@Introduct_Date<[email protected]_date) 
        BEGIN 
         SET @[email protected]_Date 
    
         INSERT INTO PRODUCT_ALL_DATES 
         SELECT @product,@Dates_Active 
    
         SELECT @Introduct_Date=dateadd(day,1,@Introduct_Date) 
    
        END 
    
    FETCH NEXT FROM POINTER_CUR 
    INTO @Product,@Introduct_Date,@Withdrawal_date 
    
    END 
    
    CLOSE POINTER_CUR 
    DEALLOCATE POINTER_CUR 
    
    SELECT * FROM PRODUCT_ALL_DATES 
    
    関連する問題