如何在 postgres plpgsql 中动态地从时间戳中提取毫秒数?

How to extract miliseconds from timestamp dynamically in postgres plpgsql?

我想使用 plsql 函数从 'Timestamp with timezone' 中获取毫秒数。 我能够生成以下函数,但它会导致毫秒数被截断。

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 函数。

extract() returns 表示 的双精度值,通过将其转换为 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;