使用时间间隔

时间:2011-07-18 13:50:19

标签: tsql sql-server-2008-r2

我有一个带有时间间隔的表(开头,结尾,typeid),如下所示:

...
14:10:44    14:15:51  1
14:12:33    14:18:42  2
15:24:09    15:24:17  1
...

有一些规则:类型为id 2 interepts的间隔,类型为1的间隔。 经过处理后我会得到类似的结果:

...
14:10:44    14:18:42 <-- as a result of merging
15:24:09    15:24:17 
...

是否存在使用此类数据的任何技术或方法?可能存在任何时间间隔的有用表示吗?

P.S。 SQL Server 2008 R2

1 个答案:

答案 0 :(得分:1)

很难对像你这样的数据进行编码。我在现实生活中见过几次。这是两个想法。

declare @t table(low time, high time, type_id tinyint)

insert @t values('14:10:44','14:15:51', 1)
insert @t values('14:12:33','14:18:42', 2)
insert @t values('15:24:09','15:24:17', 1)

select low, coalesce(a.high, t.high) high 
from @t t 
cross apply (select min(high) high 
from @t t2 
where high > t.high and type_id = 2  
and not exists (select 1 from @t 
where t2.high between low and high and type_id = 2 and not 
(t2.high = high and t2.low = low))) a
where type_id = 1

这是另一种方式。甚至可能更好,取决于您的数据。

;with cte as 
(
select low low2, high, low 
from @t where type_id = 1 
union all
select cte.high, t.high, cte.low
from @t t 
join cte on cte.high > t.low 
and cte.high < t.high 
where t.type_id = 2
)
select low, max(high) high  from cte group by low

我假设type_id 1的低值始终是set中的最低值。我也假设没有与type_id 1(和它们的子行)的行重叠集,因为这根本没有意义。