我在SQL Sever的2005者存储格式为 “HH:MM” 时间值有一个varchar字段。ss.mmmm”

我真正想要做的是采取使用内置的那些时间值的聚合函数的平均值。然而,这样的:

SELECT AVG(TimeField) FROM TableWithTimeValues

不起作用,因为(当然)SQL不会平均VARCHAR处理。然而,这

SELECT AVG(CAST(TimeField as datetime)) FROM TableWithTimeValues

也不起作用。由于靠近我可以告诉,SQL不知道如何与唯一一次值没有日期转换为时间字段。我已经尝试了各种各样的事情让SQL把这一领域成为一个日期,但到目前为止,没有运气。

任何人都可以提出一个更好的办法吗?

有帮助吗?

解决方案

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!

这将有效的值转换成开始于1900-01-01一个DATETIME。基于SQL Server的第1天= 1(整数)计算日期。天的部分然后将值1(即中午为0.5)的部分。因为日期没有在指定的转换,SQL Server的被指派了0天(1900-01-01)的值,其容纳我们需要平均的时间部分。

要在DATETIME执行AVG操作时,必须首先将时间值转换为十进制值,执行聚合,然后投退。例如

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

其他提示

尝试此

AVG(CAST(CAST('1900-01-01 ' + TimeField AS DateTime) AS Float))

您真的应该存储在那些日期时间列反正。只需使用该部分一致的日期(1/1/1900是很常见的)。然后,你可以调用AVG(),而不是担心。

我用Cadaeic的响应得到答案我一直在寻找,所以我想我应该分享代码......

我一直在寻找,将平均我所有的时间在一起,让我身边的时间全面开启所有批准的查询。下面是嵌套时,让您的AVG TAT为不同的ID号,并和嵌套的声明总体TAT

SELECT 
-- calculates overall TAT for ALL Approvals for specified period of time
-- depending on parameters of query
CONVERT(VARCHAR, CAST(AVG(CAST(CAST(LEFT(Tat_mins, 12) as datetime) AS FLOAT)) AS DATETIME), 108) + '0'

from 
(
-- tat is for individual approvals 
SELECT 
dbo.credit_application.decision_status,
dbo.credit_application.application_id,
cast(dbo.credit_application.data_entry_complete as date) as'Data Entry Date',
cast(dbo.credit_application.decision_date as DATE) as 'Decision Date',
avg(datediff(minute, dbo.credit_application.data_entry_complete, dbo.credit_application.decision_date)) as 'TAT Minutes',
convert (char(5), DateAdd(minute, Datediff(minute,dbo.credit_application.data_entry_complete, dbo.credit_application.decision_date),'00:00:00'),108) as 'TAT_Mins'
FROM  dbo.credit_application
where Decision_status not in ('P','N')

group by dbo.credit_application.decision_status,
dbo.credit_application.data_entry_complete,
dbo.credit_application.decision_date
--dbo.credit_application.application_id
)bb

您如何看待均价在日期时间?

我想你需要GROUP BY一段时间(小时?),并显示COUNT(*)?

SQL Server存储日期时间数据作为2 4字节的整数,因此,日期时间需要8个字节。第一天是因为基准日,第二个是毫秒因为午夜。

可以日期时间值转换为整数并执行数学运算,但是只转换例如返回日期时间值的“天”部选择转换(INT,GETDATE())。这是更困难的,因为一个整数返回“时间”的部分。

时使用SQL Server 2008为你的选择吗?该版本具有新的专用时间数据类型

谢谢,安迪。

我工作了所有日期的和任意点(01/01/1900),它平均并然后在其重新添加到任意的点。之间的差值

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top