0
我有一張表,它記錄了我們的應用程序中的某個應用程序的警報,如下所示,然後我們報告這些情況。然而,有時候,可能會出現一些警報或一組由於某種原因我們想要忽略的警報,例如正在進行測試,或者有人忘記在此期間關閉警報。WHERE子句的「覆蓋」配置表
我想創建一個配置表,它具有ChartId,StartTime和EndTime以及Active位(即使用此規則或不)。
下面的腳本大部分工作,除非在給定ChartId的@ReportAlarmOverride表中有多行...假設我們要忽略來自ChartId = 1的下午2:00 - 下午3:00的警報然後再從下午4點到5點。
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)