You can generate your calendar table on the fly using Itzik Ben-Gan's cascaded/stack CTEs:
DECLARE @Range AS INT
SELECT TOP 1 @Range =
DATEDIFF(DAY, MIN(start_date), MAX(end_date)) + 1
FROM yourTable
GROUP BY col1
ORDER BY DATEDIFF(DAY, MIN(start_date), MAX(end_date)) + 1 DESC
;WITH E1(N) AS( -- 10 ^ 1 = 10 rows
SELECT 1 FROM(VALUES (1),(1),(1),(1),(1),(1),(1),(1),(1),(1))t(N)
),
E2(N) AS(SELECT 1 FROM E1 a CROSS JOIN E1 b), -- 10 ^ 2 = 100 rows
E4(N) AS(SELECT 1 FROM E2 a CROSS JOIN E2 b), -- 10 ^ 4 = 10,000 rows
Tally(N) AS(
SELECT TOP(@Range) ROW_NUMBER() OVER(ORDER BY(SELECT NULL))
FROM E4
),
CteMinMax(col1, sdt, edt) AS(
SELECT col1, MIN(start_date), MAX(end_date)
FROM yourTable
GROUP BY col1
),
CteDates(col1, sdt, edt) AS(
SELECT
m.col1,
DATEADD(DAY, t.N-1, CAST(m.sdt AS DATE)),
DATEADD(DAY, t.N, CAST(m.sdt AS DATE))
FROM CteMinMax m
CROSS JOIN Tally t
WHERE DATEADD(DAY, t.N-1, CAST(m.sdt AS DATE)) < DATEADD(DAY, 1, CAST(m.edt AS DATE))
)
SELECT
t.col1,
start_date =
CASE
WHEN t.start_date > d.sdt THEN t.start_date
ELSE CAST(d.sdt AS DATETIME)
END,
end_date =
CASE
WHEN t.end_date >= d.edt THEN CAST(d.edt AS DATETIME)
ELSE t.end_date
END
FROM yourTable t
INNER JOIN CteDates d
ON d.sdt >= CAST(t.start_date AS DATE)
AND d.sdt < DATEADD(DAY, 1, CAST(t.end_date AS DATE))
SQL Fiddle