TSQL增加了缺失时间"块"

时间:2016-03-13 18:19:16

标签: sql sql-server tsql

我有一个程序,用户在Outlook中创建类似于约会的特定时间块。 结果是如下表所示(完整日期,我在本例中将其缩短为时间)

DATE_START    DATE_END    COMMENT
01:00         03:00       some comment
05:00         07:00       some comment
12:00         15:00       some comment

我现在需要生成空的时间块,因此表格如下所示:

DATE_START    DATE_END    COMMENT
01:00         03:00       some comment
03:00         05:00       dummy             <--
05:00         07:00       some comment
07:00         12:00       dummy             <--
12:00         15:00       some comment

这应该每天作为一个transact TSQL语句运行一次。我的问题是,我不知道如何比较两行来生成新行。 有什么建议吗?

编辑:我们正在使用SQL Server 2008

提前谢谢

2 个答案:

答案 0 :(得分:1)

您可以使用lead()

执行此操作
select t.date_end, t.next_date_start, 'dummy**'
from (select t.*, 
             lead(date_start) over (order by date_start) as next_date_start
      from t
     ) t
where next_date_start <> date_end;

在SQL Server 2012之前,lead()不可用,但您可以通过apply使用类似的逻辑。

答案 1 :(得分:1)

这很难看,但这适用于任何版本..

create table appointments
(
dtstart int,
dtend int ,
cmnts char(40)
)

insert into appointments

select 1,3,'dd'
union all
select 5,7 ,'dd'
union all
select 12,15,'cc'


with cte
as
(
select *,row_number() over (order by (Select null)) as rn 
from appointments 
)
select 
dummy from
(
select  distinct b.dummy,rn
from cte t1
cross apply
(select case when t2.dtstart>t1.dtend  and t1.rn+1=t2.rn then cast(t1.dtend as varchar)+'-'+cast(t2.dtstart as varchar)
 else cast(t1.dtstart as varchar)+'-'+cast(t1.dtend as varchar) end 'dummy'
from cte t2) b
) b
 order by rn  

<强>输出:

enter image description here