2011-10-19 167 views
2

我的表PRODUCT有3列:列表中的一個表的兩個日期列之間的所有日期

Product_ID 
INTRODUCED_DATE 
WITHDRAWAL_DATE 

我需要從該表中列出的日期,一個產品是active.The創建一個派生表PRODUCT_ALL_DATES日期範圍爲INTRODUCED_DATE(開始日期)和WITHDRAWAL_DATE(結束日期)

我如何在SQL Server中實現這一點,我已經表明了附加圖像的輸出樣本:?

http://i.imgur.com/vOBVa.jpg

謝謝!

+0

的[獲取日期的兩個日期之間的列表]可能重複(http://stackoverflow.com/questions/510012/get-a-list-of-dates-between-two-dates) –

+0

還值得檢查:[如何顯示SQL中兩個給定日期之間的所有日期](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種方式來實現這一

  1. 編寫存儲過程和循環throuh填充第二個表
  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

這是您的查詢的答案, 我使用光標嘗試這樣做。它工作正常。

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 
相關問題