I think the real challenge here is getting two rows out of one.
SELECT x.*, DATEDIFF(HOUR, x.StartDateTime, x.EndDateTime)
FROM (
-- if StartDateTime and EndDateTime are on different days generate two rows
SELECT ID, StartDateTime,
CONVERT(DATETIME, CONVERT(VARCHAR(10), CONVERT(DATE, StartDateTime)) + ' 23:59:59') AS EndDateTime
FROM #DateTimeSplit
WHERE DATEDIFF(DAY, StartDateTime, EndDateTime) <> 0
UNION
SELECT ID,
CONVERT(DATETIME, CONVERT(VARCHAR(10), CONVERT(DATE, EndDateTime)) + ' 00:00:00') AS StartDateTime,
EndDateTime
FROM #DateTimeSplit
WHERE DATEDIFF(DAY, StartDateTime, EndDateTime) <> 0
UNION
-- if StartDateTime and EndDateTime are on the same day just get the one row
SELECT ID, StartDateTime, EndDateTime
FROM #DateTimeSplit
WHERE DATEDIFF(DAY, StartDateTime, EndDateTime) = 0) x
This won't work if you time span goes across 3 days.
Noel