Hay dos modificaciones a su intento. Primero, no creo que pueda usar un operador como SFUNC, por lo que necesita definir una función con nombre para hacer la intersección y usarla.
CREATE or REPLACE FUNCTION int_tsrange(a tsrange, b tsrange)
returns tsrange language plpgsql as
'begin return a * b; end';
En segundo lugar, el valor predeterminado para un rango es el rango vacío, por lo que la intersección siempre estará vacía. Debe inicializar el rango a un rango infinito '[,]'
para comenzar el agregado. La definición agregada se ve así:
CREATE AGGREGATE intersection ( tsrange ) (
SFUNC = int_tsrange,
STYPE = tsrange,
INITCOND = '[,]'
);