Это звучит как проблема пропусков и островков. Вы можете найти первую дату и количество дней, используя разницу номеров строк. Остальное - агрегация и фильтрация:
select top (1) with ties min(tradingdate) as startdate,
max(tradingdate) as enddate
from (select c.*,
row_number() over (order by tradingdate) as seqnum,
row_number() over (partition by isTradingHoliday order by tradingdate) as seqnum_h
from calendar c
) c
where isTradingHoliday = 1
group by isTradingHoliday, (seqnum - seqnum_h)
order by count(*) desc