计算平均时差

时间:2018-02-12 08:52:52

标签: sql sql-server

我有一个具有不同ID的表,每个ID有两个不同的时间(Time1和Time2)。我需要检查Time1是否大于Time2然后我需要减去X = Time1 -Time2。如果Time2更大,我需要减去Y = Time2 - Time1。

这是我的查询结果:

ID      Time1                   Time2              Result
1   2018-02-12 08:00:00   2018-02-12 09:28:00     -00:32
2   2018-02-12 07:00:00   2018-02-12 08:04:00     -00:56
3   2018-02-12 06:00:00   2018-02-12 08:10:00      00:10
4   2018-02-12 06:00:00   2018-02-12 08:34:00      00:34

如果Time1更大,我会添加一个' - '在输出中区分。 我现在想要的是计算结果时间的平均值,但分别计算正数和负数。我想要的是这样的:

(00:32 + 00:56) /2

(00:10 + 00:34) /2

Time1和Time2存储为日期时间,但我将它们转换为字符串,因为我只想查看时间差,我不需要日期。 有没有办法计算平均值?

3 个答案:

答案 0 :(得分:0)

使用avg()查找平均值。 要找出负数的平均值 -

SELECT AVG(Result) FROM table_name WHERE Result like '-%';

答案 1 :(得分:0)

单独的:

select time1, time2, result ,
case when result like '-%' then avg(result)
case when result like '+%' then avg(result)
else result
end new_result
from table

如果你不想分离正面和负面的话:

select avg(total) from
( select sum(ABS(result_col) as total from table) x

答案 2 :(得分:0)

我必须在此处排除获取列Result的逻辑,因为您的逻辑没有意义(如我的评论中所述)。但是,要获得平均值,您必须进行大量转换。负时间不存在(在SQL Server中),因此您必须进行字符串操作和转换才能获得所需的值。

如果您还需要在此查询中计算Result,那么您需要更好地解释它。 '09:28' - '08:00'不是" '-00:32'" (当然不是负面的,因为第一个值很棒)。这毫无意义。

无论如何,假设您已经拥有Result的值/逻辑:

CREATE TABLE #Time (ID int,
                    Time1 datetime2(0),
                    Time2 datetime2(0),
                    Result varchar(6))
INSERT INTO #Time
VALUES (1,'20180212 08:00:00','20180212 09:28:00', '-00:32'),
       (2,'20180212 07:00:00','20180212 08:04:00', '-00:56'),
       (3,'20180212 06:00:00','20180212 08:10:00', '00:10'),
       (4,'20180212 06:00:00','20180212 08:34:00', '00:34');
GO

WITH Conversion AS (
    SELECT CASE LEFT(Result,1) WHEN '-' THEN CONVERT(time, STUFF(Result,1,1,''))
                               ELSE CONVERT(time, Result)
           END AS AbsoluteResult,
           CASE LEFT(Result,1) WHEN '-' THEN '-' ELSE '' END AS PosNeg
    FROM #Time T)
SELECT PosNeg + LEFT(CONVERT(time,DATEADD(SECOND, AVG(DATEDIFF(SECOND, 0, AbsoluteResult)), 0)),5) AS AverageTime
FROM Conversion
GROUP BY PosNeg;

GO
DROP TABLE #Time;