以下のように、アプリケーションの1つからのアラームをログに記録するテーブルがあり、これらについて報告します。ただし、テストの実行などの何らかの理由で無視したいアラームまたは一連のアラームがある場合や、誰かがその期間にアラームをオフにするのを忘れた場合があります。
たとえば、ChartId、StartTime、EndTime、およびActiveビットを持つ構成テーブルを作成したいと思います(つまり、このルールを使用するかしないか)。
以下のスクリプトは、ほとんどの場合、特定のChartIdの@ReportAlarmOverrideテーブルに複数の行がある場合を除いて機能します... ChartId=1の場合は午後2時から午後3時までのアラームを無視したいとします。午後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)