Oracle中结合预定义可预约时段与忙碌时间查询可用时间区间的问题
可预约时段筛选实现方案
核心重叠判断逻辑
判断两个时间区间是否存在重叠的通用规则(适用于所有非边界对齐场景):
时段A开始时间 < 时段B结束时间 且 时段A结束时间 > 时段B开始时间
只要可预约时段和任意忙碌时段满足上述条件,就说明存在重叠,该时段需标记为不可用,无需额外处理边界对齐问题。
Oracle 实现代码
方案1:直接查询完全可用的时段(推荐,执行效率高)
使用NOT EXISTS直接过滤所有存在重叠的可预约时段:
SELECT s.ID, s.SLOT_BEG, s.SLOT_END FROM slots s WHERE NOT EXISTS ( SELECT 1 FROM meetings m WHERE s.SLOT_BEG < m.MEET_END AND s.SLOT_END > m.MEET_BEG );
方案2:查询所有时段并标记可用状态
如果需要同时输出所有时段的可用/不可用状态,可使用左关联实现:
SELECT s.ID, s.SLOT_BEG, s.SLOT_END, CASE WHEN MAX(m.ID) IS NULL THEN '可用' ELSE '不可用' END AS AVAILABLE_STATUS FROM slots s LEFT JOIN meetings m ON s.SLOT_BEG < m.MEET_END AND s.SLOT_END > m.MEET_BEG GROUP BY s.ID, s.SLOT_BEG, s.SLOT_END;
效果说明
该逻辑自动覆盖非边界对齐的重叠场景:例如9:20-9:40的会议,会同时匹配9:15-9:30、9:30-9:45两个15分钟粒度的可预约时段,两个时段都会被标记为不可用,完全符合需求。
内容的提问来源于stack exchange,提问作者Intranet
相关产品推荐
相关产品推荐

