【问题标题】:sec_to_time() function in PostgreSQL?PostgreSQL 中的 sec_to_time() 函数?
【发布时间】:2012-08-18 14:17:54
【问题描述】:

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 中如何做到这一点?

【问题讨论】:

  • justify_interval(),也许?
  • 它抛出 ERROR: function justify_interval(double precision) does not exist LINE 1: SELECT justify_interval(sum(date_part('epoch',log_reports.lo...
  • to_char 也许?传递您的时间戳并指定您要输出的格式。

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


【解决方案1】:

使用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 而无需截断。

【讨论】:

  • @Sathish 不用担心。顺便把INTERVALs 格式化成to_char
  • @Sathish 实际上,使用to_char 完成整个事情会更好。查看更新的答案。
  • 第一个语句使用了错误的格式。格式应该是 'HH24:MI:SS' 而不是 'HH24:MM:SS' 因为分钟计算不正确。
猜你喜欢
  • 2019-07-08
  • 2013-01-22
  • 1970-01-01
  • 1970-01-01
  • 2013-05-04
  • 2018-02-27
  • 1970-01-01
  • 2012-05-10
  • 1970-01-01
相关资源
最近更新 更多