• Consider using a table of dates.

    I'm not saying this is the best solution, I'm just showing you can do it without using a loop.

    DECLARE @Dates TABLE (ID INT IDENTITY, Date DATETIME)

    -- Credit to Itzik Ben-Gan for the spiffy query to create a table of numbers then converted to dates

    ;WITH Nbrs_3( n ) AS ( SELECT 1 UNION SELECT 0 ),

    Nbrs_2( n ) AS ( SELECT 1 FROM Nbrs_3 n1 CROSS JOIN Nbrs_3 n2 ),

    Nbrs_1( n ) AS ( SELECT 1 FROM Nbrs_2 n1 CROSS JOIN Nbrs_2 n2 ),

    Nbrs_0( n ) AS ( SELECT 1 FROM Nbrs_1 n1 CROSS JOIN Nbrs_1 n2 ),

    Nbrs ( n ) AS ( SELECT 1 FROM Nbrs_0 n1 CROSS JOIN Nbrs_0 n2 )

    INSERT INTO @Dates(Date)

    SELECT DATEADD(dd, num, CAST('01/01/2012' AS DATETIME) -1) AS Date

    FROM (SELECT ROW_NUMBER() OVER (ORDER BY n) AS num

    FROM Nbrs ) t

    WHERE DATEADD(dd, num, CAST('01/01/2012' AS DATETIME) -1) BETWEEN '01/01/2012' AND '12/31/2012'

    SELECT *,CASE WHEN t.StartDate > [Date] THEN ROUND((DATEDIFF(ss, StartDate, DATEADD(dd, 1, d.[Date])) / 60.00),2)

    WHEN d.[Date] = CAST(t.EndDate AS DATE) THEN ROUND((DATEDIFF(ss, d.[Date], t.EndDate) / 60.00),2)

    WHEN d.[Date] < t.EndDate THEN ROUND((DATEDIFF(ss, d.[Date], DATEADD(dd, 1, d.[Date])) / 60.00),2)

    END

    FROM (SELECT 1 AS PatientID, '2012-10-15 10:00:00' AS StartDate, '2012-10-17 08:59:00' AS EndDate UNION

    SELECT 2 AS PatientID, '2012-10-11 08:00:00' AS StartDate, '2012-10-16 12:59:00' AS EndDate) t

    INNER JOIN @Dates d ON d.Date BETWEEN CAST(t.StartDate AS DATE) AND t.EndDate

    ORDER BY PatientID, StartDate

    Results

    PatientIDStartDateEndDateIDDate(No column name)

    12012-10-15 10:00:002012-10-17 08:59:002892012-10-15 00:00:00.000840.000000

    12012-10-15 10:00:002012-10-17 08:59:002902012-10-16 00:00:00.0001440.000000

    12012-10-15 10:00:002012-10-17 08:59:002912012-10-17 00:00:00.000539.000000

    22012-10-11 08:00:002012-10-16 12:59:002852012-10-11 00:00:00.000960.000000

    22012-10-11 08:00:002012-10-16 12:59:002862012-10-12 00:00:00.0001440.000000

    22012-10-11 08:00:002012-10-16 12:59:002872012-10-13 00:00:00.0001440.000000

    22012-10-11 08:00:002012-10-16 12:59:002882012-10-14 00:00:00.0001440.000000

    22012-10-11 08:00:002012-10-16 12:59:002892012-10-15 00:00:00.0001440.000000

    22012-10-11 08:00:002012-10-16 12:59:002902012-10-16 00:00:00.000779.000000