Я не совсем понимаю, почему вы остановились бы за минуту до полуночи. Я бы получил полные дни, используя рекурсивный CTE:
with cte as (
select fromtime,
(case when datediff(day, fromtime, totime) = 0
then totime
else dateadd(day, 1, convert(date, fromtime))
end) as dayendtime,
totime
from t
union all
select dayendtime as fromtime,
(case when datediff(day, dayendtime, totime) = 0
then totime
else dateadd(day, 1, dayendtime)
end) as dayendtime,
totime
from cte
where dayendtime < totime
)
select fromtime, dateadd(minute, -1, dayendtime)
from cte;
Здесь - это дБ <> скрипка.
Если у вас может быть больше 100 дней, вам нужно добавить option (maxrecursion 0)
к запросу.