在PostgreSQL中将时间转换为秒

时间:2010-05-12 06:48:40

标签: postgresql

我有一个时间值04:30:25,我想转换为秒。 有没有专门的功能来做这个?

我知道我们可以提取小时,分钟和秒,然后计算秒数。

SELECT EXTRACT(hour FROM t)*60*60
       + EXTRACT(minutes FROM t)*60
       + EXTRACT(seconds FROM t)
  FROM test; 

但我想要其他方式...

6 个答案:

答案 0 :(得分:30)

您是否尝试过使用:

SELECT EXTRACT(EPOCH FROM INTERVAL '04:30:25');

如果这不起作用,您可以尝试使用'1970-01-01'为时间值添加前缀,然后尝试:

SELECT EXTRACT(EPOCH FROM TIMESTAMP '1970-01-01 04:30:25');

未经测试,但似乎这些是您唯一的选择。可能。

答案 1 :(得分:11)

您可以跳过纪元或间隔,即:

SELECT EXTRACT(EPOCH FROM column ) from table

答案 2 :(得分:3)

也许你可以把它变成一个功能(只需快速设置,请根据需要查看和更改)?

CREATE OR REPLACE FUNCTION to_seconds(t text)
  RETURNS integer AS
$BODY$ 
DECLARE 
    hs INTEGER;
    ms INTEGER;
    s INTEGER;
BEGIN
    SELECT (EXTRACT( HOUR FROM  t::time) * 60*60) INTO hs; 
    SELECT (EXTRACT (MINUTES FROM t::time) * 60) INTO ms;
    SELECT (EXTRACT (SECONDS from t::time)) INTO s;
    SELECT (hs + ms + s) INTO s;
    RETURN s;
END;
$BODY$
  LANGUAGE 'plpgsql';

然后在查询中使用它:

SELECT to_seconds('04:30:25');

返回:

16225

答案 3 :(得分:2)

如果你想模仿MySQL的time_to_sec函数,你可以使用这样的函数:

CREATE OR REPLACE FUNCTION time_to_sec(t text)
  RETURNS integer AS
$BODY$ 
DECLARE 
    s INTEGER;
BEGIN
    SELECT (EXTRACT (EPOCH FROM t::interval)) INTO s; 
    RETURN s;
END;
$BODY$
  LANGUAGE 'plpgsql';

它的优势在于它可以使用PostgreSQL间隔(即:超过24小时的时间段),这会破坏接受答案中的to_seconds函数。

答案 4 :(得分:1)

作为@hdiogenes 解决方案的简化方法,只需在查询中使用它:

SELECT EXTRACT (EPOCH FROM '04:30:25'::time)

答案 5 :(得分:0)

from_seconds也要转换回来


    CREATE OR REPLACE FUNCTION from_seconds(t integer)
        RETURNS time AS
    $BODY$ 
    DECLARE 
        h INTEGER;
        m INTEGER;
        s INTEGER;
        rv TIME;
    BEGIN
        SELECT t / 3600 INTO h; 
        SELECT t % 3600 / 60 INTO m;
        SELECT t % 60 INTO s;
        SELECT (h::text || ':' || m::text || ':' || s::text)::time INTO rv;
        RETURN rv;
    END;
    $BODY$
          LANGUAGE 'plpgsql';