我有一个程序,用户在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
提前谢谢
答案 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
<强>输出:强>