计算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_commit
和 first_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"
有其他可能的解决方案使用时间戳,但我认为这个很简单。
我看到了类似的问题,但没有找到对我的问题有帮助的答案。 我有一个问题:
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_commit
和 first_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"
有其他可能的解决方案使用时间戳,但我认为这个很简单。