Có cách nào tốt hơn để hợp nhất các khoảng ngày trùng lặp không?
Giải pháp tôi đưa ra đơn giản đến mức bây giờ tôi tự hỏi liệu có ai đó có ý tưởng tốt hơn về cách thực hiện điều này không.Hợp nhất các khoảng thời gian chồng chéo ngày
/***** DATA EXAMPLE *****/
DECLARE @T TABLE (d1 DATETIME, d2 DATETIME)
INSERT INTO @T (d1, d2)
SELECT '2010-01-01','2010-03-31' UNION SELECT '2010-04-01','2010-05-31'
UNION SELECT '2010-06-15','2010-06-25' UNION SELECT '2010-06-26','2010-07-10'
UNION SELECT '2010-08-01','2010-08-05' UNION SELECT '2010-08-01','2010-08-09'
UNION SELECT '2010-08-02','2010-08-07' UNION SELECT '2010-08-08','2010-08-08'
UNION SELECT '2010-08-09','2010-08-12' UNION SELECT '2010-07-04','2010-08-16'
UNION SELECT '2010-11-01','2010-12-31' UNION SELECT '2010-03-01','2010-06-13'
/***** INTERVAL ANALYSIS *****/
WHILE (1=1) BEGIN
UPDATE t1 SET t1.d2 = t2.d2
FROM @T AS t1 INNER JOIN @T AS t2 ON
DATEADD(day, 1, t1.d2) BETWEEN t2.d1 AND t2.d2
IF @@ROWCOUNT = 0 BREAK
END
/***** RESULT *****/
SELECT StartDate = MIN(d1) , EndDate = d2
FROM @T
GROUP BY d2
ORDER BY StartDate, EndDate
/***** OUTPUT *****/
/*****
StartDate EndDate
2010-01-01 2010-06-13
2010-06-15 2010-08-16
2010-11-01 2010-12-31
*****/
Are các khoảng mở mở, đóng kín, mở đóng cửa hoặc đóng mở? Nó quan trọng bởi vì các điều kiện kết thúc khác nhau một chút tùy thuộc. Đối với nhiều mục đích, đóng cửa (bao gồm ngày đầu tiên, không kể ngày thứ hai) là đại diện tốt nhất; mở-mở (cả hai đầu bao gồm) thường là những gì mọi người có trong tâm trí. –
Jonathan, tôi đã suy nghĩ về các trường hợp khi cả ngày (ngày bắt đầu và ngày kết thúc) là một phần của khoảng thời gian. – leoinfo
Có thể thực hiện nó một lần, nhưng đó là việc triển khai con trỏ để nó phụ thuộc vào kích thước của tập dữ liệu. –