PostgreSQL中的sec_to_time()函数?

时间:2012-08-23 05:34:05

标签: mysql database postgresql postgresql-9.1 postgresql-9.0

MySQL有一个很酷的函数sec_to_time(),可以将你的秒数转换为hh:mm:ss

我已阅读邮件列表,基本上是在尝试实施以下内容:

MySQL:
select sec_to_time(sum(unix_timestamp(enddate) - unix_timestamp(startdate))) from foo;

PostgreSQL:
select XXX(sum(date_part('epoch',enddate) - date_part('epoch',startdate))) from foo;

我只需知道XXX是什么/可以是什么。我已经尝试了许多记录功能的组合。

请在PostgreSQL中如何做到这一点?

1 个答案:

答案 0 :(得分:4)

使用to_char

regress=# SELECT to_char( (9999999 ||' seconds')::interval, 'HH24:MM:SS' );
  to_char   
------------
 2777:00:39
(1 row)

这是一个产生text格式化值的函数:

CREATE OR REPLACE FUNCTION sec_to_time(bigint) RETURNS text AS $$
SELECT to_char( ($1|| ' seconds')::interval, 'HH24:MI:SS');
$$ LANGUAGE 'SQL' IMMUTABLE;

例如:

regress=# SELECT sec_to_time(9999999);
 sec_to_time 
-------------
 2777:00:39
(1 row)

如果您更喜欢INTERVAL结果,请使用:

CREATE OR REPLACE FUNCTION sec_to_time(bigint) RETURNS interval AS $$
SELECT justify_interval( ($1|| ' seconds')::interval);
$$ LANGUAGE 'SQL' IMMUTABLE;

...会产生如下结果:

SELECT sec_to_time(9999999);
       sec_to_time       
-------------------------
 3 mons 25 days 17:46:39
(1 row)

不要将INTERVAL投射到TIME;它会丢弃那些日子。使用to_char(theinterval, 'HH24:MI:SS)将其转换为text而不会截断。