1

私は CTE とその設定があまり得意ではないようです。私はそれらを理解していますが、必要な目的のために独自のものを作成するための私のスキルセットの範囲外です. 次のデザインのテーブルがあります

AbsenceID|AbsenceStart|AbsenceEnd|AbsenceType|AbsenceTypeID|StaffCode
222      |01/01/2013  |03/01/2013|FD         |1            |WWF

私は、CTE が必要に応じてデータを分割できることを確立しました。これにより、基本的に 3 行が作成されます。たとえば、以下を返す各日付に 1 つ

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

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

2 番目の例には制限はありません。

これが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 に答える
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 に答える