Teradata:日期差异的平均值截断小数

Teradata: Average of date difference truncates decimal

Teradata:我有 Start_TimestampEnd_Timestamp,我需要找到每个 ID 的平均值 Avg_Duration

数据集如下所示:

--------------------------------------------------------------------
|ID     | Start_Timestamp             |End_Timestamp               |
--------------------------------------------------------------------
|111    |2021-08-25 19:37:51.327000   |2021-08-26 16:25:51.129600  |
--------------------------------------------------------------------
|111    |2021-07-16 06:17:23.124000   |2021-07-19 13:16:53.185350  |
--------------------------------------------------------------------
|111    |2021-06-22 10:11:21.754400   |2021-02-25 18:48:13.614650  |
--------------------------------------------------------------------

我运行下面的代码:

SELECT ID, AVG((End_Timestamp - Start_Timestamp) DAY ) AS Avg_Duration
FROM Table_A
Group By ID;

结果如下所示:

-----------------------
|ID     | Aug_Duration|
-----------------------
|111    |            2|
-----------------------

我预计 Avg_Duration 会是 (1+3+3)/3=2.33

我知道 integer division 被截断了。所以,我 CAST 在取平均值将整数转换为小数之前的时间戳差异。我的代码是:

SELECT ID, AVG(CAST((End_Timestamp - Start_Timestamp) DAY AS DECIMAL(2,2))) AS Avg_Duration
FROM Table_A
Group By ID;

我预计 2.33,但是,现在 TeraData window 是 unresponsive/idle。它既不运行也没有收到任何错误消息。

谁能告诉我哪里出错了,我怎样才能得到 Avg_Duration 小数点后两位而不是截断后的一位?

您的 ) 放错了地方。但我怀疑它在 Teradata 上引起了问题,可能你只是没有注意到客户(Studio?)根本没有提交它,因为它是无效的。

这按预期工作 - 在将 DEC(2,2)(两位有效数字)更改为 DEC(6,2)(6 位有效数字)以避免溢出错误之后:

AVG(CAST((End_Timestamp - Start_Timestamp DAY(4)) AS DECIMAL(6,2)))

即使使用最大 DAY(4),您可能仍会收到 Interval Overflow 错误,但您的逻辑也可以使用日期计算:

Avg(Cast(End_Timestamp AS DATE) - Cast(Start_Timestamp AS DATE))

最后,由于它基于时间戳,您可能需要更详细的间隔,例如

Avg(End_Timestamp - Start_Timestamp DAY(4) TO SECOND(0))
Avg(End_Timestamp - Start_Timestamp DAY(4) TO MINUTE)