下面是獲取此工作的粗略指南。它將與日期間隔表和15分鐘間隔表進行比較。然後,它將對中斷事件進行求和(每個間隔1個事件),但如果發生完全中斷,則不會對部分中斷進行求和。
如果您需要,您可以使用更細化的時間間隔,我選擇15分鐘的編碼速度。
我已經有一個日期間隔表設置「CAL.t_Calendar」,所以你需要創建一個你自己的運行這段代碼。
請注意,這並不代表您應該使用的實際代碼。它只是作爲一個演示和指向你在一個可能的方向...
編輯我剛剛意識到我沒有佔空結束日期。該代碼將需要修改以檢查NULL endDates和使用@EndDate或GETDATE()如果@EndDate是在未來
--drop table ##Events
CREATE TABLE #Events (OUTAGE_ID INT IDENTITY(1,1) PRIMARY KEY
,StartDateTime datetime
,EndDateTime datetime
, completeOutage bit)
INSERT INTO #Events VALUES ('2013-07-03 07:00','2013-07-03 08:55',1),('2013-07-03 08:30','2013-07-04 10:00',0)
,('2013-07-04 12:00',NULL,0),('2013-07-04 12:30','2013-07-04 12:35',0)
--drop table #FiveMins
CREATE TABLE #FiveMins (ID int IDENTITY(1,1) PRIMARY KEY, TimeInterval Time)
DECLARE @Time INT = 0
WHILE @Time <= 1410 --number of 15 min intervals in day * 15
BEGIN
INSERT INTO #FiveMins SELECT DATEADD(MINUTE , @Time, '00:00')
SET @Time = @Time + 15
END
SELECT * from #FiveMins
DECLARE @StartDate DATETIME = '2013-07-03'
DECLARE @EndDate DATETIME = '2013-07-04 23:59:59.999'
SELECT SUM(FullOutage) * 15 as MinutesFullOutage
,SUM(PartialOutage) * 15 as MinutesPartialOutage
,SUM(NoOutage) * 15 as MinutesNoOutage
FROM
(
SELECT DateAnc.EventDateTime
, CASE WHEN COUNT(OU.OUTAGE_ID) > 0 THEN 1 ELSE 0 END AS FullOutage
, CASE WHEN COUNT(OU.OUTAGE_ID) = 0 AND COUNT(pOU.OUTAGE_ID) > 0 THEN 1 ELSE 0 END AS PartialOutage
, CASE WHEN COUNT(OU.OUTAGE_ID) > 0 OR COUNT(pOU.OUTAGE_ID) > 0 THEN 0 ELSE 1 END AS NoOutage
FROM
(
SELECT CAL.calDate + MI.TimeInterval AS EventDateTime
FROM CAL.t_Calendar CAL
CROSS JOIN #FiveMins MI
WHERE CAL.calDate BETWEEN @StartDate AND @EndDate
) DateAnc
LEFT JOIN #Events OU
ON DateAnc.EventDateTime BETWEEN OU.StartDateTime AND OU.EndDateTime
AND OU.completeOutage = 1
LEFT JOIN #Events pOU
ON DateAnc.EventDateTime BETWEEN pOU.StartDateTime AND pOU.EndDateTime
AND pOU.completeOutage = 0
GROUP BY DateAnc.EventDateTime
) AllOutages
只是想着在SQL中這樣做會讓我的頭部爆炸。 :)我可以問爲什麼不在應用程序代碼中執行此操作? –
這可以在SQL中完成(搜索[間隙和孤島問題](https://www.simple-talk.com/sql/t-sql-programming/the-sql-of-gaps-and-islands- in-sequences /)),但它太複雜了。 – Andomar
imho如果通過代碼來完成,那麼通過SQL來完成它會很有趣,並且你不得不經歷多年不同組件的故障,否則它很快就變得不可行。 – dendini