Конвертировать время в секунды в PostgreSQL - PullRequest
12 голосов
/ 12 мая 2010

У меня есть значение времени 04:30:25, которое я хочу преобразовать в секунды. Есть ли специальная функция для этого?

Я знаю, что мы можем извлечь часы, минуты и секунды, а затем вычислить секунды.

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

Но я хочу другого пути ...

Ответы [ 5 ]

31 голосов
/ 12 мая 2010

Вы пробовали использовать:

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

Если это не сработает, вы можете попытаться добавить префикс времени к «1970-01-01» и попробовать:

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

Не проверено, но, похоже, это ваши единственные варианты. Возможно.

12 голосов
/ 23 апреля 2013

Вы можете пропустить эпоху или интервал, например:

SELECT EXTRACT(EPOCH FROM column ) from table
4 голосов
/ 27 июня 2010

Возможно, вы можете сделать это функцией (просто быстрая настройка, пожалуйста, просмотрите и при необходимости измените)?

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
2 голосов
/ 30 июня 2016

Если вы хотите эмулировать функцию 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 в принятом ответе.

0 голосов
/ 06 апреля 2018

с_секунд также конвертировать обратно


    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';

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...