简体   繁体   中英

Find Gap in Dates SQL

I'm using Microsoft SQL Server and have 2 tables, AbsenceHistory and FITNoteHistory.

AbsenceHistory:

[Employee Number], [Absence Number], [Start Date], [End Date]

FITNoteHistory:

[Absence Number], [FIT Note Number], [Start Date], [End Date]

I need to identify where there is a gap in the FIT Note History, that doesn't cover the entire Absence Period between DateAdd(d,7,AbsenceHistory.[Start Date]) and AbsenceHistory.[End Date], where AbsenceHistory.[End Date] is not null and DATEDIFF(d,AbsenceHistory.[Start Date],AbsenceHistory.[End Date]) >= 7.

The output needs to give me the actual date gaps for each absence.

Eg Absence Number, Date of Gap

Can anyone help?

Example Data:

AbsenceHistory:
[Employee Number], [Absence Number], [Start Date], [End Date]
18615, 70, '01-Jan-2018', '31-Jan-2018'

FITNoteHistory:
[Absence Number], [FIT Note Number], [Start Date], [End Date]
70, 1, '08-Jan-2018', '15-Jan-2018'
70, 15, '18-Jan-2018', '24-Jan-2018'
70, 31, '26-Jan-2018', '01-Feb-2018'

My expected output would be:

[Employee Number], [Absence Number], [Gap Date]
18615, 70, '16-Jan-2018'
18615, 70, '17-Jan-2018'
18615, 70, '25-Jan-2018'

This should get you started

declare @t table ([Absence Number] int, [FIT Note Number] int, [Start Date] date, [End Date] date) 
insert into @t values
        (70, 1,  '08-Jan-2018', '15-Jan-2018')
      , (70, 15, '18-Jan-2018', '24-Jan-2018')
      , (70, 31, '26-Jan-2018', '01-Feb-2018');
select t.[Absence Number], t.[FIT Note Number], t.[Start Date], t.[End Date]
from @t t
order by t.[Start Date], t.[End Date], t.[FIT Note Number];
declare @minDate date = (select min([End Date])   from @t);
declare @maxDate date = (select max([Start Date]) from @t);
with cteDate as
(
    select @minDate as dDate
    union all 
    select cast(dateadd(dd, 1, dDate) as date) 
    from cteDate 
    where dDate < @maxDate
)
,   cteNext as
(  select t.[Absence Number], t.[FIT Note Number], t.[Start Date], t.[End Date] 
        , lead(t.[Start Date], 1)  OVER (ORDER BY t.[Start Date]) AS nextStart
   from @t t
)
select n.[Absence Number], n.[FIT Note Number], n.[Start Date], n.[End Date] 
    ,  d.dDate  
 from cteNext n 
 join cteDate d
   on d.dDate > n.[End Date] 
  and d.dDate < n.nextStart
order by d.dDate;

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM