SQL Server может преобразовывать только часть времени значения datetime из строки в datetime, однако в вашем примере точность составляет 4 десятичных знака. SQL Server 2005 распознает только 3 места. Поэтому вам нужно будет обрезать самый правый символ:
create table #TableWithTimeValues
(
TimeField varchar(13) not null
)
insert into #TableWithTimeValues
select '04:00:00.0000'
union all
select '05:00:00.0000'
union all
select '06:00:00.0000'
SELECT CAST(TimeField as datetime) FROM #TableWithTimeValues
--Msg 241, Level 16, State 1, Line 1
--Conversion failed when converting datetime from character string.
SELECT CAST(LEFT(TimeField, 12) as datetime) FROM #TableWithTimeValues
--Success!
Это преобразует действительные значения в DATETIME, начиная с 1900-01-01. SQL Server рассчитывает даты на основе 1 день = 1 (целое число). Части дней тогда являются частями значения 1 (то есть полдень составляет 0,5). Поскольку в преобразовании не была указана дата, SQL Server присвоил значение 0 дней (1900-01-01), что соответствует нашему усреднению по времени.
Чтобы выполнить операцию AVG для DATETIME, вы должны сначала преобразовать DATETIME в десятичное значение, выполнить агрегирование, а затем выполнить обратное преобразование. Например
SELECT CAST(AVG(CAST(CAST(LEFT(TimeField, 12) as datetime) AS FLOAT)) AS DATETIME) FROM #TableWithTimeValues
--1900-01-01 05:00:00.000
Если вам нужно сохранить это с дополнительным десятичным знаком, вы можете преобразовать DATETIME в VARCHAR только с временной частью и дополнить строку до 13 символов:
SELECT CONVERT(VARCHAR, CAST(AVG(CAST(CAST(LEFT(TimeField, 12) as datetime) AS FLOAT)) AS DATETIME), 114) + '0' FROM #TableWithTimeValues