EXTRACT 纪元以语法错误结束 - Postgres

EXTRACT epoch ends in a syntax error - Postgres

我需要以毫秒为单位计算两个时间戳的差异。这是我采用的方法:

-- calculate the differenz of two timestamps in milliseconds
DO $$
  declare _t1          timestamp;
  declare _t2          timestamp;
  declare _extract_ms  double precision;
BEGIN
  _t1 = now();
  _t2 = (_t1 - INTERVAL '1 HOUR');
  -- _extract_ms = EXTRACT(EPOCH FROM TIMESTAMP _t1::timestamp) - EXTRACT(EPOCH FROM TIMESTAMP _t2::timestamp); -- UNCOMMENT 01
  -- _extract_ms = EXTRACT(EPOCH FROM date_trunc('milliseconds', _t1)) - EXTRACT(EPOCH FROM date_trunc('milliseconds', _t2)); -- UNCOMMENT 02

  RAISE NOTICE '_t1=%  _t2=%  _extract_ms=%', _t1, _t2, _extract_ms;
END;
$$ LANGUAGE plpgsql;

0 - 如前所示执行代码,结果如下:

HINT: _t1=2022-02-22 14:14:59.627456 _t2=2022-02-22 13:14:59.627456 _extract_ms=<NULL>

1 - 现在取消注释标有“UNCOMMENT 01”的行并再次执行以以下结尾的代码:

ERROR: Syntax error at »_t1«
LINE 9:    _extract_ms = EXTRACT(EPOCH FROM TIMESTAMP _t1::timestamp...

2 - 现在再次注释行标记为“UNCOMMENT 01”并取消注释行标记为“UNCOMMENT 02”并再次执行:

HINT: _t1=2022-02-22 14:28:43.161478 _t2=2022-02-22 13:28:43.161478 _extract_ms=3600

这是预期的结果!

如果我只是 运行 select EXTRACT(EPOCH FROM TIMESTAMP now()); 我得到

ERROR: Syntax error at »now«
LINE 1: select EXTRACT(EPOCH FROM TIMESTAMP now());

我被 pgplsql: SELECT EXTRACT(...) functioniert nicht 绊倒了,认为这是解决方案 - 不适合我。

那么,谁能解释为什么变体 1 甚至简单的 select 语句都失败了? 提前致谢。

答案如下: ,

问题是这样的:

select extract(epoch from timestamp '02/22/2022 7:50'); 
 date_part  
------------
1645516200

select extract(epoch from '02/22/2022 7:50'::timestamp);
 date_part  
------------
 1645516200

select EXTRACT(EPOCH FROM TIMESTAMP now());
ERROR:  syntax error at or near "now"
LINE 1: select EXTRACT(EPOCH FROM TIMESTAMP now());

select timestamp now();
ERROR:  syntax error at or near "("
LINE 1: select timestamp now();

select EXTRACT(EPOCH FROM now());
     date_part     
-------------------
 1645545952.426751

TIMESTAMP是一个CAST时间戳字符串到时间戳类型。 '02/22/2022 7:50'::timestamp 也做了同样的事情。在任何一种情况下,演员表都在寻找一个字符串。您的 now() _t1/ _t12 已经是时间戳类型,因此您会收到错误消息。因此,如果您正在使用 timestamp/timestamptz/date 类型的值,请不要使用 TIMESTAMP 来转换它。