Как динамически извлечь миллисекунды из метки времени в postgres plpgsql? - PullRequest
0 голосов
/ 14 февраля 2019

Я хочу получить миллисекунды из метки времени с часовым поясом, используя функцию plsql.Я могу сгенерировать следующую функцию, но она приводит к усечению миллисекунд.

CREATE or REPLACE FUNCTION getMSFromTime(t1 timestamp with time zone) 
        RETURNS bigint AS $$
        declare time1 double precision ;
        BEGIN
        SELECT EXTRACT(EPOCH FROM t1) into time1;
        return time1;
        END;
        $$ LANGUAGE plpgsql;

, но она игнорирует миллисекунды

SELECT getMSFromTime('2019-02-11 08:01:33.423+00') //1549872093
SELECT getMSFromTime('2019-02-11 08:01:33.000+00') //1549872093

Я могу получить способ PostgreSQL, чтобыДесятичные дроби в миллисекундах также сохраняются, используя:

SELECT EXTRACT(EPOCH FROM TIMESTAMP WITH TIME ZONE '2019-02-11 08:01:33.423+00'); // 1549872093.423

Но я не могу интегрировать его в функцию, и она выдает следующую ошибку:

 syntax error at or near "t1"
LINE 5: ...ELECT EXTRACT(EPOCH FROM TIMESTAMP WITH TIME ZONE t1) into t..


CREATE or REPLACE FUNCTION getMSFromTime2(t1 timestamp with time zone) 
        RETURNS bigint AS $$
        declare time1 double precision ;
        BEGIN
        SELECT EXTRACT(EPOCH FROM TIMESTAMP WITH TIME ZONE t1) into time1;
        return time1;
        END;
        $$ LANGUAGE plpgsql;

Пожалуйста, предложите способ, чтобысоздать функцию PostgreSQL, которая может выполнять эту функцию.

1 Ответ

0 голосов
/ 14 февраля 2019

extract() возвращает двойное значение, представляющее секунд , и, передавая его в bigint, вы теряете доли секунды (= миллисекунды)

Если вы хотите, чтобы bigint представлял собой миллисекунды, вынужно умножить результат на 1000.

Нет также причины использовать PL / pgSQL для такой простой вещи:

CREATE or REPLACE FUNCTION getmsfromtime(t1 timestamp with time zone) 
  RETURNS bigint
AS $$
  SELECT (EXTRACT(EPOCH FROM t1)*1000)::bigint;
$$ 
LANGUAGE sql;
...