如何使用有限的数据在两个不同日期之间创建数据

时间:2017-01-25 01:27:07

标签: sql-server

我正在尝试在两个不同的日期之间创建数据。

表格中的数据如下所示:

StartDate  | EndDate       | StudId      | Active
-----------+---------------+-------------+-----------
01-01-2009 | 02-15-2009    |    12345    |       Y  
02-16-2009 | 03-15-2009    |    12345    |       Y  
03-16-2009 | 04-10-2009    |    12345    |       N  
04-11-2009 | 05-31-2009    |    12345    |       Y  
01-01-2009 | 02-15-2009    |    23642    |       Y  
02-16-2009 | 03-15-2009    |    23642    |       Y  
03-16-2009 | 04-10-2009    |    23642    |       N   
04-11-2009 | 05-31-2009    |    23642    |       Y  

并且表中的数据继续使用不同的Startdate,EndDate和StudID。

我想得到如下所示的结果:

Startdate   |  StudID  | Active
------------+----------+--------
01-01-2009  |  12345   |    Y
01-02-2009  |  12345   |    Y
01-03-2009  |  12345   |    Y
01-04-2009  |  12345   |    Y
  .               .         .
  .               .         .
02-15-2009  |  12345   |    Y
02-16-2009  |  12345   |    Y

如上所示,我正在尝试根据Startdate和enddate之间的日期加载学生的活动数据。

我们没有使用startdate和enddate的任何日常数据,我们需要创建每日数据。如果EndDate与下一个Startdate之间存在差距,则“有效”字段应为“0”。对于那些日期

有人可以建议怎么做吗?

2 个答案:

答案 0 :(得分:0)

这需要calendar表和join

WITH calendar
     AS (SELECT Min(StartDate) AS dates,
                Max(EndDate)   ed_date
         FROM   Yourtable
         UNION ALL
         SELECT Dateadd(dd, 1, dates),
                ed_date
         FROM   calendar
         WHERE  dates < ed_date)
SELECT a.dates as Startdate,b.StudID,b.Active
FROM   calendar a
       JOIN Yourtable b
         ON a.dates BETWEEN b.StartDate AND b.EndDate
ORDER  BY dates
OPTION (maxrecursion 0) 

注意:我已使用Recursive CTE生成日期。最好创建物理日历表并在像这样的查询中使用它

答案 1 :(得分:0)

这应该有用。

declare @tmp date;
select @tmp = max(EndDate) from tmpTable;
print @tmp
;with cte as
(
select min(StartDate) over() as dd from tmpTable
union all select dateadd(day,1,dd) from cte where dd < @tmp
)

select distinct dd as StartDate, isnull(Studid, 12345), isnull(Active,0) as Active from tmpTable as t 
right join cte as c on c.dd between t.startDate and t.enddate  
where t.Studid = 12345 or t.studid is null
option (maxrecursion 0)