If you simply want without the month split, you can try like following.
SELECT Dateadd(day, 1, [date]) start_date,
Dateadd(day, tbg - 1, [date]) end_date
FROM (SELECT *,
Datediff(day, [date], Lead([date]) OVER (ORDER BY [date])) TBG
FROM @Date) T
WHERE T.tbg > 1
Output (Without Considering overlapping months)
+------------+------------+
| start_date | end_date |
+------------+------------+
| 2018-04-03 | 2018-04-17 |
+------------+------------+
| 2018-04-20 | 2018-04-20 |
+------------+------------+
| 2018-04-30 | 2018-05-04 |
+------------+------------+
| 2018-05-10 | 2018-05-27 |
+------------+------------+
If you want to split the row which is overlapping between months, you can try like following.
;WITH cte
AS (SELECT *,
Datediff(month, start_date, end_date) md
FROM (SELECT Dateadd(day, 1, [date]) start_date,
Dateadd(day, tbg - 1, [date]) end_date
FROM (SELECT *,
Datediff(day, [date], Lead([date])
OVER (
ORDER BY [date])) TBG
FROM @Date) T
WHERE T.tbg > 1) t2)
SELECT Cast(start_date AS DATE) start_date,
Cast(end_date AS DATE) end_date
FROM (SELECT start_date,
end_date
FROM cte C1
WHERE md = 0
UNION ALL
SELECT CASE
WHEN t.n = 1 THEN start_date
ELSE Dateadd(mm, Datediff(mm, 0, end_date), 0)
END AS start_date,
CASE
WHEN t.n = 2 THEN end_date
ELSE Dateadd (dd, -1, Dateadd(mm, Datediff(mm, 0, start_date) +
1, 0))
END AS end_date
FROM cte c2
CROSS JOIN (SELECT 1 AS n
UNION
SELECT 2 AS n) t
WHERE md > 0) t1
order by start_date
Online Demo
Output
+------------+------------+
| start_date | end_date |
+------------+------------+
| 2018-04-03 | 2018-04-17 |
+------------+------------+
| 2018-04-20 | 2018-04-20 |
+------------+------------+
| 2018-04-30 | 2018-04-30 |
+------------+------------+
| 2018-05-01 | 2018-05-04 |
+------------+------------+
| 2018-05-10 | 2018-05-27 |
+------------+------------+