SQL Server 可以将日期时间值的仅时间部分从字符串转换为日期时间,但是在您的示例中,您的精度为 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!
这会将有效值转换为从 1900-01-01 开始的 DATETIME。SQL Server 根据 1 天 = 1(整数)计算日期。天的部分是值 1 的部分(即中午是 0.5)。由于在转换中没有指定日期,SQL Server 分配了 0 天 (1900-01-01) 的值,这可以满足我们对时间部分进行平均的需要。
要对 DATETIME 执行 AVG 操作,您必须首先将 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