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
来转换它。
我需要以毫秒为单位计算两个时间戳的差异。这是我采用的方法:
-- 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
来转换它。