Just a quick thought on this problem; there is no need for any string manipulation.
😎
DROP TABLE #Sample
CREATE TABLE #Sample (Startdate DATE, [start-time] INT, [end-time] INT, duration INT)
INSERT INTO #Sample (Startdate, [start-time], [end-time], duration) VALUES ('20140710', 820, 1000, 20)
;WITH T(N) AS (SELECT N FROM (VALUES (NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL)) AS X(N))
,BASE_ENTRY AS
(
SELECT
DATEADD(MINUTE,(S.[start-time] % 100),DATEADD(HOUR,FLOOR(S.[start-time] / 100) ,CONVERT(DATETIME,S.Startdate,0))) AS START_DT
,DATEADD(MINUTE,(S.[end-time] % 100),DATEADD(HOUR,FLOOR(S.[end-time] / 100) ,CONVERT(DATETIME,S.Startdate,0))) AS END_DT
,((S.duration / 100) * 60) + (S.duration % 100) AS DURATION_MINUTES
FROM #Sample S
)
SELECT
DATEADD(MINUTE,NM.N,BE.START_DT) AS Results
FROM BASE_ENTRY BE
OUTER APPLY
(SELECT TOP (((DATEDIFF(MINUTE,BE.START_DT,BE.END_DT) / BE.DURATION_MINUTES)))
(ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) -1) * BE.DURATION_MINUTES
FROM T T1, T T2, T T3, T T4) AS NM(N)
Results
-----------------------
2014-07-10 08:20:00.000
2014-07-10 08:40:00.000
2014-07-10 09:00:00.000
2014-07-10 09:20:00.000
2014-07-10 09:40:00.000