如何将“1天01:30:00”的间隔转换为“25:30:00”?

时间:2008-12-04 17:16:46

标签: postgresql formatting intervals

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

sum(time.endtime-time.starttime)

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

这里的任何人都可以帮助我吗?

6 个答案:

答案 0 :(得分:21)

我唯一可以带来的(除了解析天数和每次增加24小时):

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

它将为您提供秒数,这可能适用于Excel。

答案 1 :(得分:18)

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

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

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

请注意,'1天'不一定等于'24小时' - PostgreSQL会处理跨越DST转换的间隔。

答案 2 :(得分:18)

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

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

来源:Documentation

答案 3 :(得分:12)

如果你想让postgres为你处理HH:MM:SS格式,请在epoch秒中取差值并将其转换为以秒为单位的间隔:

SELECT SUM(EXTRACT(EPOCH FROM time.endtime) - EXTRACT(EPOCH FROM time.starttime))
         * INTERVAL '1 SECOND' AS hhmmss

答案 4 :(得分: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标准符号。

答案 5 :(得分: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的溢出。上面的内容(从内存中重构)来自我曾经写过的一些代码。为了避免冒犯那些精致的体质,我把以上的诡计包含在一个观点中......