SQL如何编写条件语句查询指定时间段内的空置租赁单元
SQL指定时间段空置单元查询逻辑修正
原语句错误原因
你的现有逻辑仅排除了租赁开始/结束日期落在查询区间内的情况,未覆盖租期完全覆盖查询区间的场景:3号单元的租期为2020年2月1日到2021年5月1日,s_date和e_date都不在2020年6月区间内,但整个6月该单元都处于被租赁状态,因此被误返回。
正确逻辑思路
判断单元在查询时间段内是否被占用的核心是两个时间区间是否存在重叠,重叠的通用判断规则为:租赁开始日期 <= 查询区间结束日期 AND 租赁结束日期 >= 查询区间开始日期
只要满足该条件,就说明单元在查询时间段内有租约,不属于空置。空置单元就是不满足该条件的记录。
修正后的查询语句
SELECT unit FROM lease WHERE NOT ( s_date <= '20200630' AND e_date >= '20200601' );
结果验证
- 1号单元租赁结束日期为20200530 < 20200601,无重叠,返回
- 2号单元租赁开始日期为20200701 > 20200630,无重叠,返回
- 3号单元租期覆盖整个6月,存在重叠,被排除
- 4号单元租期和6月有重叠,被排除
最终返回1、2号单元,符合预期。
拓展提示
如果同一个单元存在多条历史租赁记录,可添加DISTINCT去重,避免返回重复的单元编号:
SELECT DISTINCT unit FROM lease WHERE NOT ( s_date <= '20200630' AND e_date >= '20200601' );
内容的提问来源于stack exchange,提问作者Asad
相关产品推荐
相关产品推荐

