Há duas modificações em sua tentativa. Primeiro, acho que você não pode usar um operador como SFUNC, então você precisa definir uma função nomeada para fazer a interseção e usá-la.
CREATE or REPLACE FUNCTION int_tsrange(a tsrange, b tsrange)
returns tsrange language plpgsql as
'begin return a * b; end';
Em segundo lugar, o valor padrão para um intervalo é o intervalo vazio -- portanto, a interseção sempre estará vazia. Você precisa inicializar o intervalo para um intervalo infinito
'[,]'
para iniciar o agregado. A definição agregada então se parece com:CREATE AGGREGATE intersection ( tsrange ) (
SFUNC = int_tsrange,
STYPE = tsrange,
INITCOND = '[,]'
);