Есть ли лучший способ слияния интервалов между перекрывающимися датами?
Решение, которое я придумал, настолько просто, что теперь мне интересно, есть ли у кого-то еще лучшее представление о том, как это можно сделать.Объединить интервалы между точками перекрытия
/***** 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
*****/
ли интервалы с открытым открытым, закрытым, закрытым, открытым или закрытым закрытым открытым? Это важно, потому что конечные условия немного зависят друг от друга. Для многих целей открытое закрытие (включая первую дату, исключая вторую дату) является лучшим представлением; open-open (включая оба конца) часто имеют в виду люди. –
Джонатан, я думал о случаях, когда дни (дата начала и дата окончания) являются частью периода. – leoinfo
Это можно сделать однопроходным, но это реализация курсора, так что это зависит от размера набора данных. –