我有一张桌子,看起来像这样:

create table room_server_metrics (
  namespace  varchar(36) not null,
  session_id varchar(36) not null,
  primary key (namespace, session_id),

  created_at timestamptz   not null default now(),
  updated_at timestamptz   not null default now(),
);

当我试着计算所有会话的长度时,我得到:

database=> select sum(updated_at - created_at) as total_time from room_server_metrics;
         total_time         
----------------------------
 94 days 60951:01:56.381483

94天+60951小时是~2633天.

我不确定打印输出是否显示94天作为一个更容易阅读的指标,但如果我在几秒钟内打印出增量,我会得到以下结果:

database=> select extract(epoch from sum(updated_at - created_at)) as total_time from room_server_metrics;
         total_time         
----------------------------
 227546617.181704

227546617.181704秒也就是~2633天.

为什么第一个查询不减少过go 94天的小时数?我不能为我的生活弄清楚这一点哈哈.

最大值

推荐答案

感谢Adrian的 comments 和一些postgres文档研究,我发现了这个:

在内部,间隔值存储为月、日和秒. 这样做是因为一个月的天数不同,而一天 如果夏令时调整为 牵涉其中.月和日字段为整数,而秒字段 字段可以存储分数.因为间隔通常是从 常量字符串或时间戳减法,则此存储方法有效 嗯,在大多数情况下.函数JUSTUST_DAYS和JUSTUST_HOUTS为 可用于调整超出其正常范围的天数和小时数 范围.

Postgres似乎采用了每行的时间跨度,并分别将天/小时/分钟相加.在本例中,在汇总的时间间隔中有94行时间至少相当于1天.使用justify_hours函数确实解决了这个问题:

database=> select justify_hours(sum(updated_at - created_at)) as total_time from room_server_metrics;
        total_time         
---------------------------
 2637 days 08:33:22.773599

Postgresql相关问答推荐

Postgs SQL用于比较两个表之间的数据并填充到目标中

无法在PostgreSQL中创建方案和表

在Axum 0.5中,如何在一个请求处理程序中同时使用数据库和路径解析?

在Postgres中,如何删除包含N个自然数的表,并替换为生成子查询?

列不明确

Postgres 将分区附加到表的时间太长.想明白为什么

是否可以短时间运行 VACUUM FULL 并获得一些好处?

在 PostgreSQL 中 Select 数字命名列会返回 ?column?

Regexp_replace 行为会改变,如果它用空白字符串或 null 替换字符串数组中的字符串

PostgreSQL:如何避免被零除?

如何防止 PDO 将问号解释为占位符?

如何从 .sql postgresql 备份恢复单个表?

Postgresql JSONB 来了.现在用什么?Hstore?JSON?EAV?

返回 NULL 的空数组的 array_length()

如何正确索引多对多关联表?

将 csv 文件中存在的 NULL 值复制到 postgres

安装了 Postgres.app 但它不起作用

SQLAlchemy 声明式:定义触发器和索引 (Postgres 9)

PostgreSQL 字符串(255) 限制 - Rails、Ruby 和 Heroku

判断 PostgreSQL 中的角色是否设置了密码