首页 > 解决方案 > 我的半高级 PostgreSQL 查询有什么问题?(与计算时间和时间间隔有关。)

问题描述

目标:

有一列(表中不存在)表示距离下一次重复事件发生所剩的秒数,这由“最后完成”(timestamptz)和“时间跨度字符串”组合而成列,它是一个字符串,例如“7 天”或“25 分钟”或“2 周”(标准 PG 兼容间隔字符串)。

查询:

SELECT 
    *, 
    now() - "last done" - "time span string"::interval AS "seconds left until next" 
FROM "recurring events" 
ORDER BY "seconds left until next" DESC NULLS LAST;

“距离下一个秒数”列奇怪地获取以下值:

-1 days +00:32:04.389802

期望值示例:

123456

我不明白为什么它不计算列。它似乎正在以解释的方式或其他方式构造它们的值的字符串。我不知道如何描述它。

我试图 ::integer AS 表达式,但这只是给了我错误:

ERROR: cannot cast type interval to integer

问题不在于实际表达式的正确“公式”/顺序,而是它不会将列(或单元格,而是)转换为整数(表示该事件剩余的秒数,直到下一次)。

标签: sqlpostgresqldatetimestampintervals

解决方案


now() - "last done" - "time span string"::interval

在 Postgres 的日期算术中,减去时间戳会生成一个 类型的数据interval,这就是您在结果中看到的。

您可以使用以下命令将其转换为秒extract()

extract(epoch from (now() - "last done" - "time span string"::interval))

推荐阅读