следующий запрос должен работать:
select coalesce(sum(datediff(day,
(case when h.from_date < t.fromdate then t.fromdate else h.from_date end),
(case when t.to_date > t.todate then t.todate else h.to_date end)
), 0)
from (select @daterange1 as fromdate, @daterange2 as todate) const left outer join
holidays h
on h.from_date <= todate and h.to_date >= from_date;
Вот логика. Во-первых, я просто поместил константы в постоянную таблицу для удобства (ограничивает стресс клавишей «@»). Затем оставшийся запрос присоединяется к таблице праздников - необходимо, если в этот период нет праздников.
Затем он выполняет логику, где сравнивает перекрывающиеся периоды времени. Если начало праздника предшествует периоду времени, сделайте начало начала периода времени. То же самое в конце. Затем просто добавьте все эти периоды времени.
В зависимости от того, как обрабатывается «to_date», вам может потребоваться добавить «1» в период. Является ли «to_date» включенным в качестве праздника или нет. Если он включен в качестве праздника, то логика такова:
select coalesce(sum(1+datediff(day,
(case when h.from_date < t.fromdate then t.fromdate else h.from_date end),
(case when t.to_date > t.todate then t.todate else h.to_date end)
), 0)
Как вы относитесь к перекрывающимся праздникам? – HABO