piątek, 31 stycznia 2014

Wyszukiwanie przerw pomiędzy datami

Ostatnio dałem pewnej osobie do rozwązania zadanie z datami.

Mając następującą tabelę Bookings, chciałem uzyskać daty w których pokój nr 2 jest wolny

Id RoomNo DateFrom DateTo
1 2 01 Feb 2014 02 Feb 2014
2 2 04 Feb 2013 08 Feb 2014

Oczekiwany rezultat to 03/02/2014 i kolejno dni od 09/02/2014 do 28/02/2014.

Zadanie okazało się trudniejsze niż się spodziewałem. Poniżej rozwiązanie.
declare @bookings table (
    Id int identity,
    RoomNo tinyint,
    DateFrom date,
    DateTo date
)
 
insert into @bookings (RoomNo, DateFrom, DateTo)
select 2, '01 Feb 2014', '02 Feb 2014' union all
select 2, '04 Feb 2014', '08 Feb 2014'
 
select
    c.[Day]
from (select distinct cast(dateadd(day, number, '01 Feb 2014') as Date) as [Day] from [master].[dbo].[spt_values] where number between 0 and 27) c
left join @bookings b
on c.[day] between b.DateFrom and b.DateTo
where b.Id is null
Życzę powodzenia wszystkim tym, którzy będą się mierzyć z tą zagadką w przyszłości.

Prześlij komentarz