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

时间:2019-02-14 13:03:46

标签: postgresql plpgsql

我想使用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 :(得分:3)

extract()返回一个表示 seconds 的双精度值,将其强制转换为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;