我想使用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函数。
答案 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;