T-SQL 计算持续时间字段的平均值

Sai*_*Sai 3 sql-server t-sql

任何人都可以帮我解决这个问题..

我的表中有一个列将持续时间存储在nvarchar格式为“00:00:00”的字段中。

如何计算平均持续时间?我阅读了其他一些博客,也使用了如下所示的投射技术,但无法解决我的问题...

cast(cast(avg(cast(CAST(Duration as datetime) as float)) as datetime) as time) AvgTime
Run Code Online (Sandbox Code Playgroud)

请帮忙...

Aar*_*and 7

将持续时间以秒为单位存储为整数;那么平均就很容易了。现在,您正在尝试将转换为浮点数的字符串转换为转换为时间的日期时间的平均值。如果这对你来说没有错,请再读一遍。然后考虑time代表一个点时间。凌晨 3:12 和下午 4:57 的平均值是多少?中间相遇?

不要试图将其从 更改nvarchartime。同样,time是一个时间点,而不是一个间隔。您应该将开始和结束值存储为日期时间;您始终可以从中计算持续时间(通常我将持续时间视为不需要首先存储的附加无意义列)。

格式化hh:mm:ss不应该在存储时发生,只在演示时发生。并且不知道为什么您首先会使用nvarchar它 - 您希望支持哪些 Unicode 字符hh:mm:ss

同时:

SELECT CONVERT(TIME(0), DATEADD(SECOND, AVG(DATEDIFF(SECOND, 0, CONVERT(DATETIME, 
  CASE WHEN ISDATE(Duration) = 1 THEN Duration END))),0)) -- in case of garbage data 
FROM dbo.your_table_name;
Run Code Online (Sandbox Code Playgroud)

看看有多乱?会不会更容易,因为:

SELECT AVG(Duration) FROM dbo.your_table_name;
Run Code Online (Sandbox Code Playgroud)

或者:

SELECT AVG(DATEDIFF(SECOND, [start], [end])) FROM dbo.your_table_name;
Run Code Online (Sandbox Code Playgroud)

然后在客户端语言中格式化为 hh:mm:ss ?是的,我想是这样。


Han*_*non 5

我假设您的nvarchar字段中必须存储无效数据。我创建了一个简单的测试来获得平均持续时间,该测试有效:

DECLARE @T TABLE
(
    duration NVARCHAR(8)
);
INSERT INTO @T VALUES ('00:00:05');
INSERT INTO @T VALUES ('00:01:04');
INSERT INTO @T VALUES ('00:02:03');
INSERT INTO @T VALUES ('03:00:02');
INSERT INTO @T VALUES ('04:00:01');

SELECT CAST(AVG(CAST(CAST(duration AS DATETIME) AS DECIMAL(10,5))) AS DATETIME)
FROM @T;
Run Code Online (Sandbox Code Playgroud)

这将返回:

在此处输入图片说明

如果您想要时间格式的结果,您可以执行以下操作,尽管我建议不要在 T-SQL 中执行此部分 - 您应该在表示层中执行表示层内容。

SELECT CONVERT(VARCHAR(255), CAST(AVG(CAST(CAST(duration AS DATETIME) AS DECIMAL(10,5))) AS DATETIME), 108)
FROM @T;
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

我已经被这个问题和 Aaron 的出色回答说服了,应该使用开始和结束字段使用某种类型的日期数据类型来存储持续时间,或者作为一个简单的整数来表示持续时间,以最小的必要增量。例如,如果您只对某件事花费了多少周感兴趣,只需将周数存储为INT. 要查看说服我的聊天记录,请参阅http://chat.stackexchange.com/transcript/message/16134865#16134865

  • +1 但当然,如果有任何垃圾数据进入该列,则转换到 datetime 将不起作用。 (2认同)