表格中两个日期之间的日期

时间:2016-07-26 14:41:58

标签: sql sql-server-2008

我无法找到这个问题的具体答案,但如果之前已被问过,请道歉。

我有以下示例表,我保持简单,但它包含更多行和类型。它经常更新。

Type  From                         To                           Qty
1     2016-01-01 00:00:00.0000000  2016-01-03 00:00:00.0000000  30 
1     2016-01-04 00:00:00.0000000  2016-01-05 00:00:00.0000000  31
1     2016-01-06 00:00:00.0000000  NULL                         31 
2     2016-04-24 00:00:00.0000000  NULL                         15

我希望每天都能更新一张桌子(如下所示),以便显示日期之间的所有日期(包括) 。相关日期的数量必须显示到今天 TO NULL 的日期。

Type  Date                           Qty
1     2016-01-01 00:00:00.0000000    30 
1     2016-01-02 00:00:00.0000000    30
1     2016-01-03 00:00:00.0000000    30
1     2016-04-04 00:00:00.0000000    31
1     2016-04-05 00:00:00.0000000    31
1     2016-04-06 00:00:00.0000000    31
1     2016-04-07 00:00:00.0000000    31
1     .... up to today where TO is NULL
1     2016-07-25 00:00:00.0000000    31 
2     2016-04-24 00:00:00.0000000    15 
2     .... up to today where TO is NULL
2     2016-07-25 00:00:00.0000000    15

提前感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

使用Numbers表..

Demo Here

select b.*,qty from #test
cross apply
(
select dateadd(day,n,fromdate) from
numbers
where n<=
case when todate is null  
then datediff(day,fromdate,getdate()) else datediff(day,fromdate,todate) end
) b(upd)

答案 1 :(得分:1)

您可以使用递归CTE生成所有日期,并为结果生成JOIN

测试数据

Create Table Test
(
    [Type]  Int,
    [From]  Date,
    [To]    Date,
    Qty     Int 
)

Insert  Test
Values
(1, '2016-01-01', '2016-01-03',  30 ),
(1, '2016-01-04', '2016-01-05',  31 ),
(1, '2016-01-06', NULL,          31 ),
(2, '2016-04-24', NULL,          15 )

<强>查询

;With MinMax As
(
    Select  Min([From])                 MinFrom,
            Max([To])                   MaxTo,
            Convert(Date, GetDate())    Today
    From    Test
), Date (Date) As
(
    Select  MinFrom 
    From    MinMax 
    Union All
    Select  DateAdd(Day, 1, Date)
    From    Date
    Where   Date < (Select MaxTo From MinMax)
    Or      Date < (Select Today From MinMax)
)
Select  T.[Type],   
        D.[Date],
        T.Qty
From    Test    T
Join    Date    D   On  D.Date Between T.[From] And Coalesce(T.[To], Convert(Date, GetDate()))
Order By T.[Type], D.[Date]
Option  (MaxRecursion 0)

<强>结果

Type    Date        Qty
1       2016-01-01  30
1       2016-01-02  30
1       2016-01-03  30
1       2016-01-04  31
1       2016-01-05  31
1       2016-01-06  31
1       2016-01-07  31
1       2016-01-08  31
1       2016-01-09  31
1       2016-01-10  31
1       2016-01-11  31
1       2016-01-12  31
1       2016-01-13  31
1       2016-01-14  31
1       2016-01-15  31
1       2016-01-16  31
1       2016-01-17  31
1       2016-01-18  31
1       2016-01-19  31
1       2016-01-20  31
1       2016-01-21  31
1       2016-01-22  31
1       2016-01-23  31
1       2016-01-24  31
1       2016-01-25  31
1       2016-01-26  31
1       2016-01-27  31
1       2016-01-28  31
1       2016-01-29  31
1       2016-01-30  31
1       2016-01-31  31
1       2016-02-01  31
1       2016-02-02  31
1       2016-02-03  31
1       2016-02-04  31
1       2016-02-05  31
1       2016-02-06  31
1       2016-02-07  31
1       2016-02-08  31
1       2016-02-09  31
1       2016-02-10  31
1       2016-02-11  31
1       2016-02-12  31
1       2016-02-13  31
1       2016-02-14  31
1       2016-02-15  31
1       2016-02-16  31
1       2016-02-17  31
1       2016-02-18  31
1       2016-02-19  31
1       2016-02-20  31
1       2016-02-21  31
1       2016-02-22  31
1       2016-02-23  31
1       2016-02-24  31
1       2016-02-25  31
1       2016-02-26  31
1       2016-02-27  31
1       2016-02-28  31
1       2016-02-29  31
1       2016-03-01  31
1       2016-03-02  31
1       2016-03-03  31
1       2016-03-04  31
1       2016-03-05  31
1       2016-03-06  31
1       2016-03-07  31
1       2016-03-08  31
1       2016-03-09  31
1       2016-03-10  31
1       2016-03-11  31
1       2016-03-12  31
1       2016-03-13  31
1       2016-03-14  31
1       2016-03-15  31
1       2016-03-16  31
1       2016-03-17  31
1       2016-03-18  31
1       2016-03-19  31
1       2016-03-20  31
1       2016-03-21  31
1       2016-03-22  31
1       2016-03-23  31
1       2016-03-24  31
1       2016-03-25  31
1       2016-03-26  31
1       2016-03-27  31
1       2016-03-28  31
1       2016-03-29  31
1       2016-03-30  31
1       2016-03-31  31
1       2016-04-01  31
1       2016-04-02  31
1       2016-04-03  31
1       2016-04-04  31
1       2016-04-05  31
1       2016-04-06  31
1       2016-04-07  31
1       2016-04-08  31
1       2016-04-09  31
1       2016-04-10  31
1       2016-04-11  31
1       2016-04-12  31
1       2016-04-13  31
1       2016-04-14  31
1       2016-04-15  31
1       2016-04-16  31
1       2016-04-17  31
1       2016-04-18  31
1       2016-04-19  31
1       2016-04-20  31
1       2016-04-21  31
1       2016-04-22  31
1       2016-04-23  31
1       2016-04-24  31
1       2016-04-25  31
1       2016-04-26  31
1       2016-04-27  31
1       2016-04-28  31
1       2016-04-29  31
1       2016-04-30  31
1       2016-05-01  31
1       2016-05-02  31
1       2016-05-03  31
1       2016-05-04  31
1       2016-05-05  31
1       2016-05-06  31
1       2016-05-07  31
1       2016-05-08  31
1       2016-05-09  31
1       2016-05-10  31
1       2016-05-11  31
1       2016-05-12  31
1       2016-05-13  31
1       2016-05-14  31
1       2016-05-15  31
1       2016-05-16  31
1       2016-05-17  31
1       2016-05-18  31
1       2016-05-19  31
1       2016-05-20  31
1       2016-05-21  31
1       2016-05-22  31
1       2016-05-23  31
1       2016-05-24  31
1       2016-05-25  31
1       2016-05-26  31
1       2016-05-27  31
1       2016-05-28  31
1       2016-05-29  31
1       2016-05-30  31
1       2016-05-31  31
1       2016-06-01  31
1       2016-06-02  31
1       2016-06-03  31
1       2016-06-04  31
1       2016-06-05  31
1       2016-06-06  31
1       2016-06-07  31
1       2016-06-08  31
1       2016-06-09  31
1       2016-06-10  31
1       2016-06-11  31
1       2016-06-12  31
1       2016-06-13  31
1       2016-06-14  31
1       2016-06-15  31
1       2016-06-16  31
1       2016-06-17  31
1       2016-06-18  31
1       2016-06-19  31
1       2016-06-20  31
1       2016-06-21  31
1       2016-06-22  31
1       2016-06-23  31
1       2016-06-24  31
1       2016-06-25  31
1       2016-06-26  31
1       2016-06-27  31
1       2016-06-28  31
1       2016-06-29  31
1       2016-06-30  31
1       2016-07-01  31
1       2016-07-02  31
1       2016-07-03  31
1       2016-07-04  31
1       2016-07-05  31
1       2016-07-06  31
1       2016-07-07  31
1       2016-07-08  31
1       2016-07-09  31
1       2016-07-10  31
1       2016-07-11  31
1       2016-07-12  31
1       2016-07-13  31
1       2016-07-14  31
1       2016-07-15  31
1       2016-07-16  31
1       2016-07-17  31
1       2016-07-18  31
1       2016-07-19  31
1       2016-07-20  31
1       2016-07-21  31
1       2016-07-22  31
1       2016-07-23  31
1       2016-07-24  31
1       2016-07-25  31
1       2016-07-26  31
2       2016-04-24  15
2       2016-04-25  15
2       2016-04-26  15
2       2016-04-27  15
2       2016-04-28  15
2       2016-04-29  15
2       2016-04-30  15
2       2016-05-01  15
2       2016-05-02  15
2       2016-05-03  15
2       2016-05-04  15
2       2016-05-05  15
2       2016-05-06  15
2       2016-05-07  15
2       2016-05-08  15
2       2016-05-09  15
2       2016-05-10  15
2       2016-05-11  15
2       2016-05-12  15
2       2016-05-13  15
2       2016-05-14  15
2       2016-05-15  15
2       2016-05-16  15
2       2016-05-17  15
2       2016-05-18  15
2       2016-05-19  15
2       2016-05-20  15
2       2016-05-21  15
2       2016-05-22  15
2       2016-05-23  15
2       2016-05-24  15
2       2016-05-25  15
2       2016-05-26  15
2       2016-05-27  15
2       2016-05-28  15
2       2016-05-29  15
2       2016-05-30  15
2       2016-05-31  15
2       2016-06-01  15
2       2016-06-02  15
2       2016-06-03  15
2       2016-06-04  15
2       2016-06-05  15
2       2016-06-06  15
2       2016-06-07  15
2       2016-06-08  15
2       2016-06-09  15
2       2016-06-10  15
2       2016-06-11  15
2       2016-06-12  15
2       2016-06-13  15
2       2016-06-14  15
2       2016-06-15  15
2       2016-06-16  15
2       2016-06-17  15
2       2016-06-18  15
2       2016-06-19  15
2       2016-06-20  15
2       2016-06-21  15
2       2016-06-22  15
2       2016-06-23  15
2       2016-06-24  15
2       2016-06-25  15
2       2016-06-26  15
2       2016-06-27  15
2       2016-06-28  15
2       2016-06-29  15
2       2016-06-30  15
2       2016-07-01  15
2       2016-07-02  15
2       2016-07-03  15
2       2016-07-04  15
2       2016-07-05  15
2       2016-07-06  15
2       2016-07-07  15
2       2016-07-08  15
2       2016-07-09  15
2       2016-07-10  15
2       2016-07-11  15
2       2016-07-12  15
2       2016-07-13  15
2       2016-07-14  15
2       2016-07-15  15
2       2016-07-16  15
2       2016-07-17  15
2       2016-07-18  15
2       2016-07-19  15
2       2016-07-20  15
2       2016-07-21  15
2       2016-07-22  15
2       2016-07-23  15
2       2016-07-24  15
2       2016-07-25  15
2       2016-07-26  15