這是在假設沒有重疊區間的情況下工作的。
declare @startdate datetime = '2017-05-16'
declare @enddate datetime = '2017-05-26'
create table #tmpdates (id int, date1 datetime, date2 datetime, rate int)
insert into #tmpdates values (0, '2017-04-01', '2017-04-25',22)
insert into #tmpdates values (1, '2017-05-05', '2017-05-15', 10)
insert into #tmpdates values (2, '2017-05-16', '2017-05-18', 12)
insert into #tmpdates values (3, '2017-05-21', '2017-05-25', 15)
declare @final_result table (date1 date, date2 date, rate int)
insert into @final_result
select @startdate,dateadd(day,-1,t.date1),null
from #tmpdates t
where @startdate < t.date1 and
t.date1 <= (select min(t1.date1) from #tmpdates t1 where t1.date1 >= @startdate)
union all
select date1, date2, rate
from #tmpdates
where (date1 >= @startdate or date2 >= @startdate) and
(date2 <= @enddate or date1 <= @enddate)
union all
select dateadd(day,1,t.date2),
(select dateadd(day,-1,min(t3.date1))
from #tmpdates t3 where t3.date1 > t.date2) ,
null
from #tmpdates t
where dateadd(day,1,t.date2) < (select min(t1.date1) from #tmpdates t1 where t1.date1 > t.date2)
and t.date1 >= @startdate and t.date2 <= @enddate
union all
select dateadd(day,1,max(t.date2)), @enddate, null
from #tmpdates t
having max(t.date2) < @enddate
drop table #tmpdates
select * from @final_result order by date1
編輯
它從四個查詢收集數據,並做了union all
。
第一查詢:
select @startdate,dateadd(day,-1,t.date1),null
from #tmpdates t
where @startdate < t.date1 and
t.date1 <= (select min(t1.date1) from #tmpdates t1 where t1.date1 >= @startdate)
選擇@startdate
和在表中的第一個(最小的)日期之間的間隙,如果有它們將被忽略的@startdate
之前的時間間隔。因此,它會從@startdate
到間隔的第一個日期(大於@startdate
)選擇間隔(如果有的話)。
第二個查詢:
select date1, date2, rate
from #tmpdates
where (date1 >= @startdate or date2 >= @startdate) and
(date2 <= @enddate or date1 <= @enddate)
從表(非空白)選擇記錄。如果@startdate
落在該範圍之間,則包括該記錄。與@enddate
參數相同。
第三個查詢:
select dateadd(day,1,t.date2),
(select dateadd(day,-1,min(t3.date1))
from #tmpdates t3 where t3.date1 > t.date2) ,
null
from #tmpdates t
where dateadd(day,1,t.date2) < (select min(t1.date1) from #tmpdates t1 where t1.date1 > t.date2)
and t.date1 >= @startdate and t.date2 <= @enddate
選擇最小的和最大的(@startdate
和@enddate
之間的下降)的時間間隔上的表之間的間隙。
最後第四查詢:
select dateadd(day,1,max(t.date2)), @enddate, null
from #tmpdates t
having max(t.date2) < @enddate
選擇最大的日期放在桌子上,@enddate
(@startdate
和@enddate
之間最大)之間的差距,如果有一定的差距。
所有這些記錄都插入到@final_result
表中,以便它們可以按間隔排序。
我真的無法理解你想在這裏實現什麼。你可以試着再解釋一遍嗎? –
OP有一個開始日期和一個結束日期加上一個包含日期範圍的表。他想要查找表中不存在的開始日期和結束日期之間的範圍。 – Tanner
@Tanner這還不夠。爲什麼1-4和19-20,而不是17和21-24? –