看該圖表示一些重疊的時間段
X----| |--------| |------X
|-------X X------------X
|----| X----|
開頭或任何連續的時間段的結束時,標有X
不屬於任何其他時間段的內部。如果我們確定這些時間,我們可以取得一些進展。
該查詢標識邊界。
SELECT boundary FROM
(
-- find all the lower bounds
SELECT d1.StartDate AS boundary, 'lower' as type
FROM dates d1
LEFT JOIN dates d2 ON (
d1.StartDate > d2.StartDate
AND
d1.StartDate < d2.EndDate
)
WHERE d2.RowId IS NULL
GROUP BY d1.StartDate
UNION
-- find all the upper bounds
SELECT d1.EndDate AS boundary, 'upper' as type
FROM dates d1
LEFT JOIN dates d2 ON (
d1.EndDate > d2.StartDate
AND
d1.EndDate < d2.EndDate
)
WHERE d2.RowId IS NULL
GROUP BY d1.StartDate
) as boundaries
ORDER BY boundary ASC
您的數據這個查詢的結果是
boundry | type
------------------
2011-01-01 | lower
2011-02-20 | upper
2011-03-01 | lower
2011-04-01 | upper
日期範圍你是abouve顯示連續的上限和下限之間之後。通過一些後期處理,可以很容易地找到它們。
如果我正確理解您的問題,那麼您應該可以使用DATEDIFF函數執行此操作 – Muleskinner
我建議您以任何語言運行SQL查詢都要這樣做。數據庫級別的處理級別通常不是一個好主意 - 不是數據庫本來應該做的。 –