我有一个名为ITIncidents
的表格,用于跟踪事件的实例和时间长度。
通过获取最大EndDate
并与GetDate()
进行比较,我可以获得自上次事件发生以来的时间长度(“自上次发生以来已经过了3天,6小时56秒事件“)。
我想计算出一个事件结束到另一个事件开始之间的时间量之前的“记录”。
示例架构和数据位于:http://sqlfiddle.com/#!6/6ec2a/1
我查看了this question并尝试使用此代码:
WITH rows AS
(
SELECT *, ROW_NUMBER() OVER (ORDER BY DataDate) AS rn
FROM mytable
)
SELECT DATEDIFF(second, mc.DataDate, mp.DataDate)
FROM rows mc
JOIN rows mp
ON mc.rn = mp.rn - 1
这种情况,但由于我在计算一行结束日期和另一行结束日期之间的差异,我甚至都在努力使用DATEDIFF
。
在SQLFiddle示例中,最后一个条目的EndDate
的日期是2017-11-01 00:10:00
,因此截至2017年11月8日00:00:00,它已经过了6天,23小时,50分钟最后一次事件,但之前的“记录”是在2017-10-09 15:10:00
上结束的事件与开始的事件2017-11-01 00:00:00
之间的时间长度
答案 0 :(得分:1)
试试这个:
select t.id, f.Period
from (select --top 1 --uncomment here
l.id,
m = (case when f.m < 0 then 0 else f.m end)
from itincidents as l
outer apply (select top 1 StartDate
from itincidents as r
where l.id < r.id
order by r.id
) as r
cross apply (select datediff(minute, l.EndDate,
coalesce(r.StartDate, getdate())) as m
) as f
--order by l.id desc --and here to get only last record
) as t
cross apply
(select
case when t.m < 60 then convert(varchar(10),t.m) + ' Min'
when t.m < 1440 then convert(varchar(10),t.m/60) + ' Hr, ' +
convert(varchar(10),t.m%60) + ' Min'
else convert(varchar(10),t.m/1440) + ' Days, ' +
convert(varchar(10),(t.m%1440)/60) + ' Hr, ' +
convert(varchar(10), (t.m%1440) % 60) + ' Min'
end as [Period]
) as f
在您的dataset上测试了中断序列(删除了一条记录):
以获取自上次事件以来的差异:
select case when t.m < 60 then convert(varchar(10),t.m) + ' Min'
when t.m < 1440 then convert(varchar(10),t.m/60) + ' Hr, ' +
convert(varchar(10),t.m%60) + ' Min'
else convert(varchar(10),t.m/1440) + ' Days, ' +
convert(varchar(10),(t.m%1440)/60) + ' Hr, ' +
convert(varchar(10), (t.m%1440) % 60) + ' Min'
end as [Period]
from (select datediff(minute, max(l.EndDate), getdate()) as m
from itincidents as l) as t
在dataset上进行了测试:
答案 1 :(得分:0)
这是你在找什么?
SELECT A.*, CONCAT(datediff(d,A.enddate,B.StartDate),' days ',datediff(HOUR,A.enddate,B.StartDate), ' hours ',datediff(MINUTE,A.enddate,B.StartDate), ' minutes') DateDifference
FROM [ITIncidents] A INNER JOIN [ITIncidents] B on B.id=A.id+1