-2

我有一个名为 holiday_master 的表,其中 3 列分别命名为 from_date、to_date 和 duration。现在当用户输入一个日期范围时,让 daterange1 和 daterange2,在假日表的基础上,编写一个 sql 来查找假期数。它将包括 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)

4

1 回答 1

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)
于 2013-04-21T16:19:15.053 回答