を提供されたデータのために働く:、
select * into #t from (
select 1 ID, '2016-04-06 09:00:00' r_start , '2016-04-06 09:15:00' r_end union
select 2, '2016-04-06 11:00:00', '2016-04-06 11:30:00'union
select 3, '2016-04-06 12:00:00', '2016-04-06 12:45:00'union
select 4, '2016-04-06 16:30:00', '2016-04-06 16:45:00') AS bookdata
クエリ以下のすべての自由な時間スロットを結果:
;with booked as (
select r_start, r_end
, LAG(r_end) over (order by r_end) PrevBook
, LEAD(r_start) over (order by r_start) NextBook
from #t
)
select IsNull(PrevBook, '2016-04-06 07:00:00') AS FreeStart, r_start AS FreeEnd
from booked
union
select r_end, IsNull(NextBook, '2016-04-06 19:00:00')
from booked
結果
+---------------------+---------------------+
| FreeStart | FreeEnd |
+---------------------+---------------------+
| 2016-04-06 07:00:00 | 2016-04-06 09:00:00 |
| 2016-04-06 09:15:00 | 2016-04-06 11:00:00 |
| 2016-04-06 11:30:00 | 2016-04-06 12:00:00 |
| 2016-04-06 12:45:00 | 2016-04-06 16:30:00 |
| 2016-04-06 16:45:00 | 2016-04-06 19:00:00 |
+---------------------+---------------------+
あなたは2012年よりも古いSQLを使用している場合は、主キー
;with booked as (
select r_start, r_end
, (select top 1 r_end from #t where ID < tbl.ID order by ID desc) PrevBook
, (select top 1 r_start from #t where ID > tbl.ID order by ID) NextBook
from #t tbl
)
select IsNull(PrevBook, '2016-04-06 07:00:00') AS FreeStart, r_start AS FreeEnd
from booked
union
select r_end, IsNull(NextBook, '2016-04-06 19:00:00')
from booked
として、あなたの持っているIDを想定すると、代わりにクエリの下に使用することができますので、あなたはLEADとLAGを持っていません**してください「回答としてマーク」の場合この投稿は質問に回答しました
あなたは疲れていますか?表示 –