我有一张表格,它记录来自我们的一个应用程序的警报,如下所示,我们报告这些。然而,有时可能会有一个警报或一组警报由于某种原因我们想要忽略,例如运行测试,或者有人忘记在那个时间段内关闭警报。
我想创建一个配置表,其中包含一个 ChartId、一个 StartTime、一个 EndTime 和一个 Active 位(即,使用或不使用此规则)。
以下脚本在大多数情况下都有效,除非我在给定 ChartId 的 @ReportAlarmOverride 表中有多行...假设我们要忽略 ChartId = 1 的下午 2:00 至下午 3:00 的警报,然后再忽略下午 4:00 - 下午 5:00。
DECLARE @ReportAlarmOverride TABLE
(
ReportAlarmOverrideId INT IDENTITY(1,1),
ChartId INT,
Active BIT,
StartTime DATETIME,
EndTime DATETIME,
LastModifiedTime DATETIME DEFAULT GETDATE()
)
INSERT INTO @ReportAlarmOverride
SELECT 1, 1, GETDATE() - 1, NULL, NULL UNION
SELECT 3, 1, GETDATE() - 1, GETDATE(), NULL UNION
SELECT 5, 1, GETDATE() - 3, NULL, NULL UNION
SELECT 7, 1, GETDATE() - 1, NULL, GETDATE() --UNION
--SELECT 3, 1, '2012-11-12 16:09:20', '2012-11-12 16:09:21', NULL --Adding this row makes SELECT below stop working
SELECT Alarm.AlarmTime, AlarmOverride.StartTime, AlarmOverride.EndTime, *
FROM dbo.AlarmLogSummary Alarm
JOIN dbo.AlarmConfiguration AlarmConfig ON Alarm.AlarmConfigurationId = AlarmConfig.AlarmConfigurationId
LEFT JOIN @ReportAlarmOverride AlarmOverride ON AlarmConfig.ChartId = AlarmOverride.ChartId
WHERE Alarm.AlarmTime > GETDATE() - 2
AND ((AlarmOverride.Active = 1 AND Alarm.AlarmTime NOT BETWEEN AlarmOverride.StartTime AND ISNULL(AlarmOverride.EndTime, GETDATE()))
OR Active = 0)