Я предполагаю, что ваша проблема заключается в получении нескольких строк из одной, а не форматировании значений даты / времени в виде строки.
Для этого вы можете использовать рекурсивный CTE:
with cte as (
select startdate as thetime, t.*
from t
union all
select dateadd(hour, 1, cte.startdate), . . . -- rest of columns here
from cte
where cte.thetime < cte.enddate
)
select cte.*
from cte;
Затем вы можете отформатировать thetime
так, как вам нравится, включая дефисированную версию в вашем вопросе.
В SQL Server для рекурсии установлено ограничение по умолчанию 100 - количество создаваемых строк.В вашем примере используется только время, поэтому оно не может превышать 24 и не является проблемой.Однако это может быть проблемой в других обстоятельствах, в этом случае option (maxrecursion 0)
может быть добавлено к запросу.