Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 列出表中两个日期列之间的所有日期_Sql_Sql Server_Date - Fatal编程技术网

Sql 列出表中两个日期列之间的所有日期

Sql 列出表中两个日期列之间的所有日期,sql,sql-server,date,Sql,Sql Server,Date,我的表格产品有3列: Product_ID INTRODUCED_DATE WITHDRAWAL_DATE 我需要从此表中创建一个派生表PRODUCT\u ALL\u DATES,该表列出产品的所有活动日期。日期范围为引入日期开始日期和提取日期结束日期 如何在SQL Server中实现这一点?我已在所附图像中指出了示例输出: 谢谢 我可以想出两种方法来实现这一点 declare @dateh table(ind int identity(1,1),date1 smalldatetime,dat

我的表格产品有3列:

Product_ID
INTRODUCED_DATE
WITHDRAWAL_DATE
我需要从此表中创建一个派生表PRODUCT\u ALL\u DATES,该表列出产品的所有活动日期。日期范围为引入日期开始日期和提取日期结束日期

如何在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
编写存储过程并循环throuh以填充第二个表 用另一种语言编写一个程序。
显而易见的问题是,你为什么要这样做?什么问题不能用当前形式的数据来解决取决于日期的总范围,这应该可以解决。如果总的日期范围很大,则可能需要调整最大递归

;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<=@Withdrawal_date)
    BEGIN
        SET @Dates_Active=@Introduct_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 

可能的重复也值得检查:如果递归执行的日期范围大于100倍,它将终止。您需要在末尾添加选项MAXRECURSION 0,以便它在更大的日期范围内正确执行。