• 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