在日期SQL中查找差距

时间:2018-03-01 17:03:41

标签: sql sql-server date tsql gaps-in-data

我使用的是Microsoft SQL Server,并且有2个表,AbsenceHistory和FITNoteHistory。

saveButton.Clicked += async (s, args) =>
{
    //save the data you need here
    //clear the entries/picker
    yourEntry.Focus();
};

我需要确定FIT注释历史中存在差距的地方,但并不涵盖整个AbsenceHistory: [Employee Number], [Absence Number], [Start Date], [End Date] FITNoteHistory: [Absence Number], [FIT Note Number], [Start Date], [End Date]

输出需要给出每次缺席的实际日期差距。

E.g。缺席号码,缺口日期

有人可以帮忙吗?

示例数据:

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.

我的预期输出是:

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'

1 个答案:

答案 0 :(得分:0)

这应该让你入门

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;