I have a table that contains 3 columns :
Name | Datetime_Start | Datetime_End
A | 2017-01-02 00:00 | 2017-03-28 00:10
A | 2017-05-14 23:50 | 2017-05-29 23:50
B | 2017-05-18 00:00 | 2017-05-18 04:00
B | 2017-05-18 02:00 | 2017-05-18 03:00
C | 2017-01-02 00:00 | 2017-01-17 15:50
C | 2017-01-14 03:50 | 2017-01-28 15:50
I would like the output to be like this,(basically merge overlapping periods into one):
Name | Datetime_Start | Datetime_End
A | 2017-01-02 00:00 | 2017-03-28 00:10
A | 2017-05-14 23:50 | 2017-05-29 23:50
B | 2017-05-18 00:00 | 2017-05-18 04:00
C | 2017-01-02 00:00 | 2017-01-28 15:50
I tried to use what's suggested here : Eliminate and reduce overlapping date ranges
But my results are not merged correctly and I think it's due to the time part of my datetime values...
If a period ends at the exact moment the other one starts, the periods should be merged.
select Name, Min(NewStartDate) Datetime_Start, MAX(Datetime_End) Datetime_End
from
(
select *,
NewStartDate = t.Datetime_Start+n.number,
NewStartDateGroup =
dateadd(d,
1- DENSE_RANK() over (partition by Name order by t.Datetime_Start+n.number),
t.Datetime_Start+n.number)
from Mytable t
inner join dbo.Numbers n
on n.number <= DATEDIFF(d, Datetime_Start, Datetime_End)
) X
group by Name, NewStartDateGroup
(dbo.Numbers contains 1 column of number values from 0 to 1 000 000)
Output :
Name | Datetime_Start | Datetime_End
A | 2017-11-04 00:10:00.000 | 2017-12-05 15:10:00.000
A | 2017-11-04 23:10:00.000 | 2017-12-05 15:10:00.000
A | 2017-11-05 00:10:00.000 | 2017-12-05 15:10:00.000
A | 2017-11-05 23:10:00.000 | 2017-12-05 15:10:00.000
A | 2017-11-06 23:10:00.000 | 2017-12-05 15:10:00.000
A | 2017-11-07 00:10:00.000 | 2017-12-05 15:10:00.000
A | 2017-11-07 23:10:00.000 | 2017-12-05 15:10:00.000
A | 2017-11-08 00:10:00.000 | 2017-12-05 15:10:00.000