我似乎对CTE并不是很好并且设置它们。我理解他们,但他们只是在我的技能范围之外,为了我需要的目的创造我自己的技能。我有一个包含以下设计的表
AbsenceID|AbsenceStart|AbsenceEnd|AbsenceType|AbsenceTypeID|StaffCode
222 |01/01/2013 |03/01/2013|FD |1 |WWF
我已经确定CTE可以根据需要拆分数据,这实际上会产生3条线。每个日期返回一个,例如下面的
AbsenceID|Absencedate|AbsenceType|AbsenceTypeID|StaffCode
222 |01/01/2013 |FD |1 |WWF
223 |02/01/2013 |FD |1 |WWF
224 |03/01/2013 |FD |1 |WWF
答案 0 :(得分:0)
您不需要CTE。拥有Days表会好得多。如果你有它,那么就这样加入:
select *
from Absences a
join Days d on d.Dat between a.AbsenceStart and a.AbsenceEnd
此外,可以归因天数,属性可以像
一样用于过滤where d.IsHoliday = 0
答案 1 :(得分:0)
当datediff(d,AbsenceStart,AbsenceEnd)< 2047
这是SqlFiddle上的演示。
select AbsenceID + number 'AbsenceID', AbsenceType, dateadd(d, v.number, AbsenceStart) 'Absencedate',
AbsenceTypeID, StaffCode
from master..spt_values v, abc a
where type='p'
and dateadd(d, v.number, AbsenceStart) between AbsenceStart and AbsenceEnd
第二个例子没有任何限制。
这是SqlFiddle上的演示。
with cte
as
(
select AbsenceID, AbsenceID incr, AbsenceStart, AbsenceEnd, AbsenceType, AbsenceTypeID, StaffCode
from abc
union all
select b.AbsenceID, b.AbsenceID + 1 incr, DATEADD(D, 1, b.AbsenceStart) AbsenceStart,
b.AbsenceEnd, a.AbsenceType, a.AbsenceTypeID, a.StaffCode
from abc a inner join cte b on a.AbsenceID = b.AbsenceID
where b.AbsenceStart < a.AbsenceEnd
)
select incr AbsenceID, AbsenceType, AbsenceStart, AbsenceTypeID, StaffCode
from cte
order by 1
option (maxrecursion 0)