我有一个名为holiday_master的表,其中3列名为from_date,to_date和duration.Now当用户输入日期范围时,让daterange1和daterange2,在holiday table的基础上,写一个sql来查找数量holidays.It将包括from_date和to_date。
例如 from_date to_date持续时间 2012/08/01 2012/08/03 3 2012/09/17 2012/09/24 8
用户进入:2012/07/30至2012/08/02(节假日数:2) 2012/09/20至2012/09/29(节假日数:5)
答案 0 :(得分:1)
以下查询应该有效:
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)