WITH Timestamps AS ( SELECT startdt AS ts FROM dbo.Phones UNION ALL SELECT COALESCE(enddt, 99991231) FROM dbo.Phones UNION ALL SELECT startdt FROM dbo.Addresses UNION SELECT COALESCE(enddt, 99991231) FROM dbo.Addresses ), TSRN AS -- Timestamps with Row Numbers ( SELECT ts, ROW_NUMBER() OVER(ORDER BY ts) AS pos FROM Timestamps ), Intervals AS ( SELECT Cur.ts AS startdt, Nxt.ts AS enddt FROM TSRN AS Cur JOIN TSRN AS Nxt ON Nxt.pos = Cur.pos + 1 ) SELECT I.startdt, I.enddt, P.phone, A.address FROM Intervals AS I LEFT OUTER JOIN dbo.Phones AS P ON COALESCE(P.enddt, 99991231) > I.startdt AND P.startdt < I.enddt LEFT OUTER JOIN dbo.Addresses AS A ON COALESCE(A.enddt, 99991231) > I.startdt AND A.startdt < I.enddt;