I думаю, это то, что вы хотите - по крайней мере, он дает желаемый результат на основе ваших выборочных данных:
select greatest(tb1.start_date, tb2.start_date, tb3.start_date) as max_start_date,
least(tb1.end_date, tb2.end_date, tb3.end_date) as max_end_date,
tb3.start_date as tb3_start_date,
tb3.end_date as tb3_end_date,
tb1.j1,
tb1.j2,
tb1.fruit,
tb2.vegetable,
tb3.car
from tb1
join tb2
on (tb2.j1, tb2.j2) = (tb1.j1, tb1.j2)
and daterange(tb2.start_date, tb2.end_date, '[]') && daterange(tb1.start_date, tb1.end_date, '[]')
join tb3
on daterange(tb3.start_date, tb3.end_date, '[]') && daterange(tb1.start_date, tb1.end_date, '[]')
and daterange(tb3.start_date, tb3.end_date, '[]') && daterange(tb2.start_date, tb2.end_date, '[]');
Онлайн пример: http://rextester.com/HBFY75494