我的表PRODUCT
有3列:列表中的一個表的兩個日期列之間的所有日期
Product_ID
INTRODUCED_DATE
WITHDRAWAL_DATE
我需要從該表中列出的日期,一個產品是active.The創建一個派生表PRODUCT_ALL_DATES
日期範圍爲INTRODUCED_DATE
(開始日期)和WITHDRAWAL_DATE
(結束日期)
我如何在SQL Server中實現這一點,我已經表明了附加圖像的輸出樣本:?
謝謝!
我的表PRODUCT
有3列:列表中的一個表的兩個日期列之間的所有日期
Product_ID
INTRODUCED_DATE
WITHDRAWAL_DATE
我需要從該表中列出的日期,一個產品是active.The創建一個派生表PRODUCT_ALL_DATES
日期範圍爲INTRODUCED_DATE
(開始日期)和WITHDRAWAL_DATE
(結束日期)
我如何在SQL Server中實現這一點,我已經表明了附加圖像的輸出樣本:?
謝謝!
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
如果遞歸執行的次數多於100次(較大的日期範圍),它將終止。您需要在最後添加OPTION(MAXRECURSION 0),以便在更大的日期範圍內正確執行。 –
對此表示贊同 – rahularyansharma
我能想到的2種方式來實現這一
顯而易見的問題是爲什麼你要這樣做?數據處於當前形式無法解決的問題是什麼
根據日期的總範圍,這應該起作用。如果總體日期範圍較大,則可能需要調整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
這是您的查詢的答案, 我使用光標嘗試這樣做。它工作正常。
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
的[獲取日期的兩個日期之間的列表]可能重複(http://stackoverflow.com/questions/510012/get-a-list-of-dates-between-two-dates) –
還值得檢查:[如何顯示SQL中兩個給定日期之間的所有日期](http://stackoverflow.com/questions/1490566/how-to-display-all-the-dates-between-two-given-dates -in-sql) –