下面的查詢應該工作:
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 2013-04-23 17:30:42