有一个旧的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%'
想看看从EventID
1201 - 1200 asTimeFull
经过的时间SUM然后想要显示这一天10小时,并看到我们称之为Downtime%
的百分比让我们说SUM是2:00:00
我们将除以10:00:00
以显示下面
这是我在看到答案后看到的内容
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中扣除该百分比。这样做也可以很容易地根据车道号匹配事件。如果您不喜欢这样,那么您可以轻松地恢复旧方法。根据样本日期,似乎描述文本上的匹配是重复的。也许您的数据实际上更复杂。