You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PostgreSQL中计算嵌套JSON数组内指定ID的时长总和

用PostgreSQL计算嵌套JSON数组中各ID的总时长

假设你的表(示例表名your_table)里有一个JSON类型字段(示例字段名task_data),存储的嵌套JSON数组格式类似:

[
{"id": 55, "days": [{"duration": "3:00"}, {"duration": "4:00"}]},
{"id": 56, "days": [{"duration": "5:00"}, {"duration": "4:00"}]}
]

下面是直接可用的查询语句,能按ID分组计算所有duration的总和:

SELECT
  parent_obj->>'id' AS id,
  TO_CHAR(
    SUM(MAKE_INTERVAL(
      hours => (SPLIT_PART(day_obj->>'duration', ':', 1))::INT,
      minutes => (SPLIT_PART(day_obj->>'duration', ':', 2))::INT
    )),
    'HH24:MI'
  ) AS duration
FROM
  your_table,
  json_array_elements(your_table.task_data) AS parent_obj,
  json_array_elements(parent_obj->'days') AS day_obj
GROUP BY
  parent_obj->>'id';

关键步骤说明

  • json_array_elements():两次调用分别展开最外层数组和每个ID对应的days子数组,把嵌套结构扁平化。
  • SPLIT_PART():将duration的"小时:分钟"字符串拆分为数值,方便转换为时间间隔。
  • MAKE_INTERVAL():把拆分后的小时、分钟转为PostgreSQL原生的时间间隔类型,支持直接求和。
  • SUM() + GROUP BY:按ID分组,累加所有天数的时长。
  • TO_CHAR():把求和后的时间间隔格式化为你需要的HH:MI字符串格式。

执行后会得到类似这样的结果:

id  duration
55  07:00
56  09:00

内容的提问来源于stack exchange,提问作者nikhil raj

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 03:10:16