我有一个具有不同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存储为日期时间,但我将它们转换为字符串,因为我只想查看时间差,我不需要日期。 有没有办法计算平均值?
答案 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;