计算PostgreSQL中两个时间戳之间唯一必要的差异和分组依据

Calculate the only necessary difference and Group by between two Timestamps in PostgreSQL

我看到了类似的问题,但没有找到对我的问题有帮助的答案。 我有一个问题:

    select au.username
        ,ej.id as "job_id"
        ,max(ec."timestamp") as "last_commit"
        ,min(ec."timestamp") as "first_commit"
        ,age(max(ec."timestamp"), min(ec."timestamp")) as "diff as age"
        ,to_char(age(max(ec."timestamp")::timestamp, min(ec."timestamp")::timestamp),'HH:MI:SS') as "diff as char"
        ,et.id as "task_id"
from table and etc..

以及我的输出(对不起,图片但它是最佳视图):

因此,如您所见,我有带区域的时间戳,并且我尝试计算 last_commitfirst_commit 之间的差异。在函数 age 中它运行良好,但我只需要从这个减法中提取小时和分钟。 N.B! 只有小时和分钟,而不是天 例如 job_id=1 第一行,差异是 2 分 42 秒,其中 job_id=2 第二行,区别是 2 小时 2 分 55 秒,而不是 16 天 X 24 小时,我不需要计算天数。当我尝试 to_char 时,它的 return 并不完全符合我的预期。我图片中绿色的最后两列,显示我的期望和想要的。因此,对于每一行,计算 last and first commit 之间的差异仅包括小时和分钟(换句话说,仅计算时间而不是日期),并通过 task_id 计算总和,如图片最后一列所示。
谢谢。

试试这个:

SELECT age(max(ec."timestamp"), min(ec."timestamp")) - date_trunc('day', age(max(ec."timestamp"), min(ec."timestamp")))

您可以尝试将时间戳类型转换为时间,例如 answer

字符串SQL的结果是:

select au.username
        ,ej.id as "job_id"
        ,max(ec."timestamp") as "last_commit"
        ,min(ec."timestamp") as "first_commit"
        ,(max(ec."timestamp")::time-min(ec."timestamp")::time) as "diff as age"
        ,to_char(age(max(ec."timestamp")::timestamp, min(ec."timestamp")::timestamp),'HH:MI:SS') as "diff as char"
        ,et.id as "task_id"

有其他可能的解决方案使用时间戳,但我认为这个很简单。