我有一个具有不同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存储为Datetimes,但我将它们转换为字符串,因为我只想查看时间差,我不需要日期。有没有办法计算平均值?
使用avg()来查找平均值。要找出负面的平均值 -
SELECT AVG(Result) FROM table_name WHERE Result like '-%';
我不得不排除在这里获取列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;
分离:
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