。 我有3個停機時間鏈接。我想知道我的服務何時可用。的SQL Server日期遞歸
Sample
DECLARE @Downtime AS TABLE(id int, beginDT datetime, endDT datetime)
INSERT INTO @Downtime VALUES('a','09:00','11:00')
INSERT INTO @Downtime VALUES('b','10:00','12:00')
INSERT INTO @Downtime VALUES('c','12:00','13:00')
INSERT INTO @Downtime VALUES('d','15:00','16:00')
DECLARE @TimeParam AS DATETIME
SET @TimeParam ='1900-01-01 11:00:00.000'
在11:00,我處於停機狀態(id = 1或2,無所謂)。 我的問題是,「當服務可用(不下來)?」
答案在樣本上是13:00。因爲我們從9到11(id = 1)的停機時間,id = 2給我們11到12,id = 3顯示12到13.因此,它將從9減少到13。需要一個SQL查詢來發現。開始/結束時的遞歸在另一個結束之間。
我嘗試類似的東西,但它的非法語法
;WITH myDates(beginDT,endDT)
AS
(
SELECT beginDT, enddt
FROM @Downtime D1
WHERE @TimeParam BETWEEN begindt AND endDT
UNION ALL
SELECT beginDT, endDT
FROM @Downtime D2
WHERE
(SELECT TOP 1 Max(enddt)
FROM myDates)
BETWEEN begindt AND endDT
)
SELECT * FROM myDates
更多樣本
INSERT INTO @Downtime VALUES('e','12:00','17:00')
INSERT INTO @Downtime VALUES('f','15:00','19:00')
INSERT INTO @Downtime VALUES('g','19:00','20:00')
INSERT INTO @Downtime VALUES('h','20:00','21:00')
INSERT INTO @Downtime VALUES('i','21:00','22:00')
INSERT INTO @Downtime VALUES('j','22:00','23:00')
INSERT INTO @Downtime VALUES('k','23:00','23:01')
INSERT INTO @Downtime VALUES('l','22:00','23:05')
INSERT INTO @Downtime VALUES('m','22:00','23:06')
INSERT INTO @Downtime VALUES('n','22:00','23:05')
INSERT INTO @Downtime VALUES('o','22:00','23:17')
INSERT INTO @Downtime VALUES('p','23:17','23:22')
INSERT INTO @Downtime VALUES('q','23:22','23:23')
INSERT INTO @Downtime VALUES('r','23:25','23:30')
結束停機,應該是23:23。
爲什麼不編寫代碼而不是用SQL努力工作呢?幾行代碼可以以更容易,也許沒有錯誤的方式來實現 – nrathaus
我知道,但是它的速度較慢,主要是如果我有很多停機時間。 – forX
我搜索sql查詢的方式,我可以在代碼上執行,但它在經常調用的網頁上。 – forX