0

以下のように、アプリケーションの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)
4

1 に答える 1

3

@ReportAlarmOverrideテーブルを結合する代わりに、次のようにこのロジックをWHERE句に入れてみてください。

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, *
FROM dbo.AlarmLogSummary Alarm
    JOIN dbo.AlarmConfiguration AlarmConfig ON Alarm.AlarmConfigurationId = AlarmConfig.AlarmConfigurationId
WHERE Alarm.AlarmTime > GETDATE() - 2
  AND NOT EXISTS(SELECT 1 FROM @ReportAlarmOverride Override
                    WHERE Override.ChartId = AlarmConfig.ChartId
                      AND Override.Active = 1
                      AND Alarm.AlarmTime BETWEEN Override.StartTime AND ISNULL(Override.EndTime, GETDATE())

唯一の問題は、クエリでオーバーライドデータを返すことができないことです。必要ないことを願っています。

于 2012-11-20T13:23:58.397 に答える