23

我需要添加一些间隔并在 Excel 中使用结果。

自从

sum(time.endtime-time.starttime)

将间隔返回为“1 天 01:30:00”,这种格式破坏了我的 Excel 工作表,我认为有像“25:30:00”这样的输出会很好,但在 PostgreSQL 中没有办法做到这一点文档。

这里有人可以帮我吗?

4

6 回答 6

23

由于该主题没有确切的解决方案:

=> SELECT date_part('epoch', INTERVAL '1 day 01:30:00') * INTERVAL '1 second' hours;
  hours
-----------
 25:30:00
(1 row)

资料来源:文档

于 2014-06-23T10:01:34.143 回答
21

我唯一能想到的(除了解析天数并每次将小时数加 24)是:

mat=> select date_part('epoch', '01 day 1:30:00'::interval);
 date_part 
-----------
     91800
(1 row)

它会给你秒数,这对于excel来说可能没问题。

于 2008-12-04T17:30:53.423 回答
18

您可以使用EXTRACT将间隔转换为秒。

SELECT EXTRACT(EPOCH FROM INTERVAL '5 days 3 hours');
Result: 442800

然后你需要自己做数学(或让 Excel 做)。

请注意,“1 天”不一定等同于“24 小时”——PostgreSQL 处理诸如跨越 DST 转换的间隔之类的事情。

于 2008-12-04T17:35:06.163 回答
12

如果您希望 postgres 为您处理 HH:MM:SS 格式,请以纪元秒为单位获取差异并将其转换为以秒为单位的间隔:

SELECT SUM(EXTRACT(EPOCH FROM time.endtime) - EXTRACT(EPOCH FROM time.starttime))
         * INTERVAL '1 SECOND' AS hhmmss
于 2011-06-16T19:29:48.090 回答
0

在标准 SQL 中,您希望将类型表示为 INTERVAL HOUR TO SECOND,但您有一个 INTERVAL DAY TO SECOND 类型的值。您不能使用 CAST 来获得所需的结果吗?在 Informix 中,符号可以是:

SUM(time.endtime - time.starttime)::INTERVAL HOUR(3) TO SECOND

CAST(SUM(time.endtime - time.starttime) AS INTERVAL HOUR(3) TO SECOND)

前者是 AFAIK,特定于 Informix 的表示法(或者,至少不是标准的);我相信后者是 SQL 标准表示法。

于 2008-12-04T17:47:11.643 回答
0

可以做到,但我相信唯一的方法是通过以下怪物(假设您的时间间隔列名称为“ti”):

select
              to_char(floor(extract(epoch from ti)/3600),'FM00')
    || ':' || to_char(floor(cast(extract(epoch from ti) as integer) % 3600 / 60), 'FM00')
    || ':' || to_char(cast(extract(epoch from ti) as integer) % 60,'FM00')
    as hourstamp
from whatever;

看?我告诉过你这太可怕了:)

认为那会很好

select to_char(ti,'HH24:MI:SS') as hourstamp from t

会起作用,但可惜的是,HH24 格式不会“吸收”超过 24 的溢出。以上内容(从内存中重构)来自我曾经编写的一些代码。为了避免得罪那些体质脆弱的人,我将上述恶作剧概括为一个观点......

于 2008-12-08T23:19:32.953 回答