Twoja próba ma dwie modyfikacje. Po pierwsze, nie sądzę, że możesz użyć operatora jako SFUNC, więc musisz zdefiniować nazwaną funkcję do wykonania przecięcia i użyć jej.
CREATE or REPLACE FUNCTION int_tsrange(a tsrange, b tsrange)
returns tsrange language plpgsql as
'begin return a * b; end';
Po drugie, domyślną wartością zakresu jest zakres pusty -- więc przecięcie zawsze będzie puste. Musisz zainicjować zakres do nieskończonego zakresu '[,]'
aby rozpocząć agregację. Definicja zagregowana wygląda wtedy tak:
CREATE AGGREGATE intersection ( tsrange ) (
SFUNC = int_tsrange,
STYPE = tsrange,
INITCOND = '[,]'
);