查找sql​​中给定日期范围之间的假日数

时间:2013-04-21 16:12:36

标签: sql sql-server

我有一个名为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)

1 个答案:

答案 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)