以下查询应该有效:
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)