Это больше похоже на проблему интервала перекрытия слиянием.Вот одно решение, которое поддерживает текущий счетчик начала и конца:
CREATE TABLE ds1 (P_STARTDATE DATE, P_ENDDATE DATE);
CREATE TABLE ds2 (P_STARTDATE DATE, P_ENDDATE DATE);
INSERT INTO ds1 VALUES
('2007-01-01', '2015-06-01');
INSERT INTO ds2 VALUES
('2015-03-01', '2017-01-01'),
('2017-01-02', NULL);
WITH cte1(d, v) AS (
SELECT P_startDate, +1 FROM ds1 UNION ALL
SELECT P_EndDate, -1 FROM ds1 UNION ALL
SELECT P_startDate, +1 FROM ds2 UNION ALL
SELECT P_EndDate, -1 FROM ds2
), cte2(d, c) AS (
SELECT d, SUM(SUM(v)) OVER (ORDER BY CASE WHEN d IS NULL THEN 2 ELSE 1 END, d)
FROM cte1
GROUP BY d
), cte3(d, c, f) AS (
SELECT d, c, CASE WHEN LAG(c) OVER (ORDER BY CASE WHEN d IS NULL THEN 2 ELSE 1 END, d) > 0 THEN 0 ELSE 1 END
FROM cte2
), cte4(d, c, g) AS (
SELECT d, c, SUM(f) OVER (ORDER BY CASE WHEN d IS NULL THEN 2 ELSE 1 END, d)
FROM cte3
)
SELECT MIN(d) AS FromDate, CASE WHEN COUNT(d) = COUNT(*) THEN MAX(d) END AS ToDate
FROM cte4
GROUP BY g;
Результат:
FromDate ToDate
01/01/2007 00:00:00 01/01/2017 00:00:00
02/01/2017 00:00:00 02/01/2017 00:00:00