2010-08-24 103 views
0

我現在鴕鳥政策,如果這是這樣一個問題,在正確的地方,但I'll試試吧:)SQL查詢時間範圍

我有幾個SQL數據庫的條目代表的時間段

例如

Datefrom  datetill 
2010-10-01  2011-01-01 
2011-02-01  2011-05-16 
2011-08-08  2011-09-01 

我需要測試給定的時間段是否完全覆蓋了條目。

有沒有一個聰明的方法來解決這個問題? 我的第一個想法是檢查最短日期和最大日期,但是在這段時間內的「漏洞」怎麼樣?

也許有一些SQL優點是願意幫我...

原諒我的英語,it's新臺幣我的母語。

+0

時間段條目是否可能重疊?澄清一下,你的第二條記錄是否可以從2010-12-31開始? – InSane 2010-08-24 10:54:08

+2

您使用的是什麼RDBMS? – 2010-08-24 10:54:51

+0

期間條目可能重疊,並且可能存在「漏洞」。 我們使用MS-SQL Server 2008 – 2010-08-24 11:02:55

回答

1

這是一種方法。

DECLARE @startdate DATE = '2010-10-01' 
DECLARE @enddate DATE = '2011-01-02'; 

WITH FullRange AS 
(
    SELECT @startdate AS [DATE] 
    UNION ALL 
    SELECT DATEADD(d,1,[DATE]) 
    FROM FullRange 
    WHERE [DATE] < @enddate 
), 
DatesTable AS 
(
SELECT CAST('2010-10-01' AS DATE) Datefrom, CAST('2011-01-01' AS DATE) datetill UNION ALL 
SELECT CAST('2011-02-01' AS DATE) Datefrom, CAST('2011-05-16' AS DATE) datetill UNION ALL 
SELECT CAST('2011-08-08' AS DATE) Datefrom, CAST('2011-09-01' AS DATE) datetill 
) 
/*Return any dates in the range that are unmatched*/ 
SELECT FullRange.[DATE] 
FROM FullRange 
WHERE NOT EXISTS 
(SELECT * FROM DatesTable WHERE [DATE] BETWEEN Datefrom AND datetill) 
OPTION (MAXRECURSION 0) 
+0

哇。很好的答案!非常感謝! – 2010-08-24 12:01:49