计算从一列开始的经过时间

问题描述 投票:0回答:1

有一个旧的SQL 2000 DB ...想要看到基于在另一列中有两个单独的值,从同一列中经过的时间差异。

DECLARE @Now DATETIME,
    @Yesterday DATETIME,
    @StartTime VARCHAR(16),
    @EndTime VARCHAR(16)
SET @StartTime = '01:00:00AM'
SET @EndTime   = '11:59:00PM'
SET @Now = GETDATE()
SET @Yesterday = DATEADD(dd, DATEDIFF(dd, 0, @Now), -1) 
select EventTime, Description, EventID
from EventLog
WHERE   EventTime BETWEEN @Yesterday + ' ' + @StartTime
                  AND     @Yesterday + ' ' + @EndTime
          AND     EventID in (1200 ,1201)
          AND     Description LIKE 'Lane _ Full PE%'

enter image description here

想看看从EventID 1201 - 1200 asTimeFull经过的时间SUM然后想要显示这一天10小时,并看到我们称之为Downtime%的百分比让我们说SUM是2:00:00我们将除以10:00:00以显示下面

enter image description here

---------------------------------


这是我在看到答案后看到的内容

enter image description here

sql sql-server
1个回答
0
投票
select
    cast(sum(TimeFullInSeconds) / 3600 as varchar(2)) + ':'
     + right('0' + cast(sum(TimeFullInSeconds) % 3600 / 60 as varchar(2)), 2) + ':'
     + right('0' + cast(sum(TimeFullInSeconds) % 60 as varchar(2)), 2) as TimeFull,
     /* assumes same day */
     100 - sum(TimeFullInSeconds) * 100 / datediff(ss, @StartTime, @EndTime) as "Downtime%"
from (
    select datediff(ss, EventTime,
               (
               select min(EventTime) from EventLog l2
               where l2.EventTime > l.EventTime
                   and l2.EventID = 1201
                   and Description like left(l.Description, 6) + ' Full PE%')
               ) as TimeFullInSeconds
    from EventLog l
    where EventID = 1200 and Description like 'Lane _ Full PE%'
) t

我不知道你的业务规则,但你会清楚地做出某种假设,即不会有两个“完整”和“清晰”的事件在不同的车道上重叠。您似乎也假设较大的窗口将仅跨越正确配对的事件。我会按照这些假设去做。

在我看来,计算从“完全”到“清除”的时间可能更好,然后从100中扣除该百分比。这样做也可以很容易地根据车道号匹配事件。如果您不喜欢这样,那么您可以轻松地恢复旧方法。根据样本日期,似乎描述文本上的匹配是重复的。也许您的数据实际上更复杂。

http://rextester.com/DAFR66165

© www.soinside.com 2019 - 2024. All rights reserved.