Isso NÃO compila:
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);
A questão parece ser a SELECT
seguinte INTERVAL
.
Mas isso compila:
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;
Meu colega e eu não consigo entender o porquê.
Alguém pode explicar?
Explicação
A função
interval()
não faz o que você parece pensar. Você pode usar o nome do tipo assim para converter um valor (digitado ou não digitado):Mas você não pode usá-lo como função (seguido de parênteses). Isso só é implementado para alguns tipos básicos. Ver:
Existem duas funções denominadas "interval" registradas no Postgres 14, uma pegando
time
, a outrainterval
einteger
. Não é o que você quer:Você parece querer um elenco, mas não precisa disso para começar, pois o resultado de sua expressão complicada
interval
já está.Solução
Desembaraçado:
now()::DATE::timestamp
queima atéCURRENT_DATE
. O último édate
em vez detimestamp
, mas o resultado da expressão é o mesmo. (Depende datimezone
configuração da sua sessão atual.)Ou, ainda mais simples:
Como a única referência à tabela é
min(last_ts)
, isso sempre retorna uma única linha, mesmo que a tabela esteja vazia. E o resultado é o mesmo do anterior.