需要查看一组日期放在一起是否大于或等于sql中的固定范围

时间:2016-01-09 19:09:48

标签: sql sql-server

我有一个存储日期的表,架构是:

  TENANT | START DATE | END DATE  | LOFT

想象以下范围: 2015-07-01至2015-08-01

如果在该表中我有以下行

   Lisa  | 2015-06-29 | 2015-07-15 | 1
   George| 2015-07-15 | 2015-08-01 | 1
   Anna  | 2015-07-01 | 2015-08-10 | 2
   Luke  | 2015-05-01 | 2015-07-15 | 3
   Hailey| 2015-07-17 | 2015-08-01 | 3

我想知道LOFT是否在固定范围内的租借期间。阁楼3被放弃的原因是在07-15至07-17期间的2天内保持有人居住。 我需要返回 loft 1和2 。有关如何做到这一点的任何想法?

谢谢!

1 个答案:

答案 0 :(得分:2)

一种方法是扩展范围内的所有日期。这是一种蛮力方法:

with cte as (
      select cast('2015-07-01' as date) as dte
      union all
      select dateadd(day, 1, dte)
      from cte
      where dateadd(day, 1, dte) <= cast('2015-08-01' as date)
)
select loft
from t join
     cte
     on cte.dte between t.startdate and t.enddate
group by loft
having count(distinct cte.dte) = (select count(*) from cte);

注意:这使用递归子查询来获取范围中的天数。它也可以使用日历表或数字表。