获取自上次发生事件以来的时间长度

时间:2017-11-08 10:09:03

标签: sql sql-server-2008 tsql

我有一个名为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之间的时间长度

2 个答案:

答案 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上测试了中断序列(删除了一条记录):

enter image description here

以获取自上次事件以来的差异:

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上进行了测试:

enter image description here

答案 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