平均在SQL Server 2005中的时间价值
-
22-08-2019 - |
题
我在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),它平均并然后在其重新添加到任意的点。之间的差值