I\'ve seen a lot of solutions to identify records where date ranges overlap, and still other examples of merging overlapping ranges.
However I am interested in results
Try:
select ab.CustomerID,
case when ab_Eff_Dt > c.Eff_Dt then ab_Eff_Dt else c.Eff_Dt end abc_Eff_Dt,
case when ab_End_Dt < c.End_Dt then ab_End_Dt else c.End_Dt end abc_End_Dt
from
(select a.CustomerID,
case when a.Eff_Dt > b.Eff_Dt then a.Eff_Dt else b.Eff_Dt end ab_Eff_Dt,
case when a.End_Dt < b.End_Dt then a.End_Dt else b.End_Dt end ab_End_Dt
from #tmp a
join #tmp b
on a.CustomerID = b.CustomerID and a.Eff_Dt < b.End_Dt and b.Eff_Dt < a.End_Dt
where a.ProductID = 'PRODUCT_A' and b.ProductID = 'PRODUCT_B') ab
join #tmp c
on ab.CustomerID = c.CustomerID and ab_Eff_Dt < c.End_Dt and c.Eff_Dt < ab_End_Dt
where c.ProductID = 'PRODUCT_C'
(SQLFiddle here)