这不会编译:
SELECT add_compression_policy(
hypertable => 'exchange.candles',
compress_after => INTERVAL ((SELECT now()::DATE::timestamp - (SELECT min(last_ts) FROM exchange.capture_tracker))),
if_not_exists => TRUE);
问题似乎SELECT
如下INTERVAL
。
但这编译:
WITH delay AS (SELECT now()::DATE::timestamp - (SELECT min(last_ts) FROM exchange.capture_tracker) myinterval)
SELECT add_compression_policy(
hypertable => 'exchange.candles',
compress_after => myinterval,
if_not_exists => TRUE) FROM delay;
我的同事和我不明白为什么。
谁能解释一下?
解释
该功能
interval()
并没有按照您的想法执行。您可以使用这样的类型名称来转换一个值(类型化或非类型化):但是您不能将其用作函数(后跟括号)。这仅适用于一些基本类型。看:
在 Postgres 14 中注册了两个名为“interval”的函数,一个取,
time
另一个取. 不是你想要的:interval
integer
你似乎想要一个演员表,但你不需要一开始,因为你复杂的表达的结果
interval
已经是。解决方案
解开:
now()::DATE::timestamp
烧到CURRENT_DATE
. 后者是date
代替timestamp
,但表达式的结果是一样的。(取决于timezone
您当前会话的设置。)或者,更简单:
由于对表的唯一引用是
min(last_ts)
,因此即使表为空,它也始终返回单行。结果与上述相同。