If you are sure the date value is always 1 day behind for times less than 06:00:
Declare @testData table (date_column date, time_column time(0));
Insert Into @testData (date_column, time_column)
Values ('20220227', '23:00')
, ('20220227', '01:00')
, ('20220227', '06:00')
, ('20220228', '07:00')
;
Select *
, actual_date = dateadd(day, iif(td.time_column <= '06:00', 1, 0), td.date_column)
, full_datetime = cast(td.date_column As datetime) + cast(td.time_column As datetime) + iif(td.time_column <= '06:00', 1, 0)
, full_datetime2 = dateadd(day, datediff(day, 0, dateadd(day, iif(td.time_column <= '06:00', 1, 0), td.date_column)), cast(td.time_column As datetime2))
From @testData td;
And we can 'simplify' this to:
Select *
, actual_date = dateadd(day, t.is_next_day, td.date_column)
, full_datetime = cast(td.date_column As datetime) + cast(td.time_column As datetime) + t.is_next_day
, full_datetime2 = dateadd(Day, datediff(day, 0, dateadd(day, t.is_next_day, td.date_column)), cast(td.time_column As datetime2))
From @testData td
Cross Apply (Values (iif(td.time_column <= '06:00', 1, 0))) As t(is_next_day);