Ci sono due modifiche al tuo tentativo. Innanzitutto, non penso che tu possa usare un operatore come SFUNC, quindi devi definire una funzione denominata per eseguire l'intersezione e usarla.
CREATE or REPLACE FUNCTION int_tsrange(a tsrange, b tsrange)
returns tsrange language plpgsql as
'begin return a * b; end';
In secondo luogo, il valore predefinito per un intervallo è l'intervallo vuoto, quindi l'intersezione sarà sempre vuota. Devi inizializzare l'intervallo su un intervallo infinito '[,]'
per iniziare l'aggregato. La definizione aggregata sarà quindi simile a:
CREATE AGGREGATE intersection ( tsrange ) (
SFUNC = int_tsrange,
STYPE = tsrange,
INITCOND = '[,]'
);