You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在单表中筛选calendar_id=1且与calendar_id=2无时间重叠的事件

解决日历事件无重叠筛选问题

嘿,我来帮你搞定这个需求!你要从现有表中找出calendar_id=1的所有事件,并且这些事件和calendar_id=2的任何事件都没有时间重叠对吧?下面给你两种实用的SQL实现思路,都能满足你的需求:

方法一:使用NOT EXISTS子查询

这是最直观的写法,核心逻辑是:对每个calendar_id=1的事件,检查是否存在与之重叠的calendar_id=2事件,不存在的就保留下来。

SELECT 
    event_id,
    start,
    end
FROM 
    your_table_name cal1
WHERE 
    cal1.calendar_id = 1
    AND NOT EXISTS (
        SELECT 1
        FROM your_table_name cal2
        WHERE cal2.calendar_id = 2
        -- 时间重叠的判断条件:两个事件的时间区间有交集
        AND cal1.start < cal2.end
        AND cal1.end > cal2.start
    );

方法二:使用LEFT JOIN + NULL判断

这种方法通过左连接关联重叠事件,然后筛选出没有匹配到重叠事件的记录:

SELECT DISTINCT
    cal1.event_id,
    cal1.start,
    cal1.end
FROM 
    your_table_name cal1
LEFT JOIN 
    your_table_name cal2 
    ON cal2.calendar_id = 2
    AND cal1.start < cal2.end
    AND cal1.end > cal2.start
WHERE 
    cal1.calendar_id = 1
    AND cal2.event_id IS NULL;

举个例子验证

用你给出的示例数据:

event_idcalendar_idstartend
10111/1/10 20:001/1/10 22:00
10221/1/10 20:001/1/10 21:00
10311/1/10 22:001/2/10 02:00

运行上面的SQL后,只会返回event_id=103的记录——因为101和102的时间区间有重叠,而103的开始时间刚好是102的结束时间,属于无重叠的情况。

内容的提问来源于stack exchange,提问作者ravid007

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 12:10:57