Sql 记录两次之间的间隔
下面给出的是我所拥有的其中一个表中的一组数据,有没有办法跟踪空闲时间?e、 g 11:00-12:00和18:45-19:15作为该日期的间隔Sql 记录两次之间的间隔,sql,sql-server,sql-server-2005,Sql,Sql Server,Sql Server 2005,下面给出的是我所拥有的其中一个表中的一组数据,有没有办法跟踪空闲时间?e、 g 11:00-12:00和18:45-19:15作为该日期的间隔 Date Activity From To Duration 2013-09-09 00:00:00.000 Work 08:00 11:00 3.00 2013-09-09 00:00:00.000 Travel 12:00 13:00 1.00 2013-09-09 00:00
Date Activity From To Duration
2013-09-09 00:00:00.000 Work 08:00 11:00 3.00
2013-09-09 00:00:00.000 Travel 12:00 13:00 1.00
2013-09-09 00:00:00.000 Work 13:00 15:00 2.00
2013-09-09 00:00:00.000 Work 15:00 18:00 3.00
2013-09-09 00:00:00.000 Travel 18:00 18:45 0.75
2013-09-09 00:00:00.000 Work 19:15 22:15 3.00
我期待着下面这样的事情
Date Activity From To Duration
2013-09-09 00:00:00.000 Work 08:00 11:00 3.00
2013-09-09 00:00:00.000 Gap 11:00 12:00 1.00
2013-09-09 00:00:00.000 Travel 12:00 13:00 1.00
2013-09-09 00:00:00.000 Work 13:00 15:00 2.00
2013-09-09 00:00:00.000 Work 15:00 18:00 3.00
2013-09-09 00:00:00.000 Travel 18:00 18:45 0.75
2013-09-09 00:00:00.000 Gap 18:45 19:15 0.50
2013-09-09 00:00:00.000 Work 19:15 22:15 3.00
这可以不循环地完成吗?如果是的话,?怎么做呢?为什么DUARTION是INT类型?
以下查询将原始表与输出间隙的查询合并,然后按日期和起始日期对该合并进行排序
请尝试:
select
[Date],
Activity,
[From],
[To],
CONVERT(varchar(5), CONVERT(Datetime,[TO])-CONVERT(Datetime,[FROM]), 108) Duration
From
(
select
[Date],
'Gap' Activity,
[To] [From],
(select top 1 d.[From] from YourTable d where CONVERT(datetime, d.[Date]+d.[From])>CONVERT(datetime, a.[Date]+a.[To]) order by CONVERT(datetime, d.[Date]+d.[From])) as [To],
NULL as Duration
from YourTable a
where
(select COUNT(*) from YourTable b where CONVERT(datetime, b.[Date]+b.[From])=CONVERT(datetime, a.[Date]+a.[To]))=0
union all
select * From YourTable
)x
where
[To] IS NOT NULL
order by CONVERT(datetime, x.[Date]+x.[From])
请看这个。Alex输出应该是什么?@techdo:请在上面找到修改后的问题From和To列的数据类型是什么?您可以使用如下方法:选择ID,StartSeqNo=SeqNo+1,EndSeqNo=从dbo.GapsIslands中选择MINB.SeqNo作为B,其中B.ID=A.ID,从dbo.GapsIslands中选择B.SeqNo>A.SeqNo-1作为A,其中不存在,从dbo.GapsIslands中选择*作为B,其中B.ID=A.ID和B.SeqNo=A.SeqNo+1和SeqNo<从dbo.GapsIslands中选择MAXSeqNo,其中B.ID=A.ID,从本作品下面的链接。谢谢但是,当表中有大量数据时,它肯定会影响性能。有轻松的机会吗?
select
[Date],
Activity,
[From],
[To],
CONVERT(varchar(5), CONVERT(Datetime,[TO])-CONVERT(Datetime,[FROM]), 108) Duration
From
(
select
[Date],
'Gap' Activity,
[To] [From],
(select top 1 d.[From] from YourTable d where CONVERT(datetime, d.[Date]+d.[From])>CONVERT(datetime, a.[Date]+a.[To]) order by CONVERT(datetime, d.[Date]+d.[From])) as [To],
NULL as Duration
from YourTable a
where
(select COUNT(*) from YourTable b where CONVERT(datetime, b.[Date]+b.[From])=CONVERT(datetime, a.[Date]+a.[To]))=0
union all
select * From YourTable
)x
where
[To] IS NOT NULL
order by CONVERT(datetime, x.[Date]+x.[From])