1

我似乎不太擅长 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
4

2 回答 2

0

你不需要 CTE。最好有一张 Days 表。如果你有它,那么就这样加入:

select *
from Absences a
join Days d on d.Dat between a.AbsenceStart and a.AbsenceEnd

也可以归因于天,并且可以像这样使用属性进行过滤

where d.IsHoliday = 0 
于 2013-09-27T13:23:14.903 回答
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)
于 2013-09-27T17:26:31.367 回答