我正在尝试在两个不同的日期之间创建数据。
表格中的数据如下所示:
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”。对于那些日期
有人可以建议怎么做吗?
答案 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)