我有一个存储日期的表,架构是:
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 。有关如何做到这一点的任何想法?
谢谢!
答案 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);
注意:这使用递归子查询来获取范围中的天数。它也可以使用日历表或数字表。