• I think you avoid all the CROSS APPLYs, as below.

    As written the code just ignores anything beyond 24 hrs, but if you needed to, you could add a check for that.

    SELECT

    StartTime, EndTime,

    CONVERT(varchar(8), DATEADD(SECOND, DATEDIFF(SECOND, StartTime, EndTime)

    - CASE WHEN DATEPART(NANOSECOND, StartTime) > DATEPART(NANOSECOND, EndTime) THEN 1 ELSE 0 END, 0), 108) +

    '.' + RIGHT(REPLICATE('0', 7) +

    CAST(((CASE WHEN DATEPART(NANOSECOND, StartTime) > DATEPART(NANOSECOND, EndTime) THEN 1000000000 ELSE 0 END +

    DATEPART(NANOSECOND, EndTime) - DATEPART(NANOSECOND, StartTime)) / 100) AS varchar(7)), 7) AS TimeDiff

    FROM SourceTable

    ORDER BY ID

    SQL DBA,SQL Server MVP(07, 08, 09) A socialist is someone who will give you the shirt off *someone else's* back.