MySQL中基于两日期列的区间查询结果异常求助
解决MySQL时间段筛选的问题
咱们先明确你的需求:你需要从events表中筛选出与2018-01-14至2018-01-16这个时间段存在重叠的记录,预期得到eventId为1和3的数据。
你原来SQL的问题
你写的查询语句:
SELECT eventId FROM events WHERE startDate <= '2018-01-30' AND DueDate <= '2018-01-30'
(我猜你这里可能是笔误,本来想写2018-01-16?不过不管目标日期是什么,这个逻辑本身就不对)
这个条件要求事件的开始日期和结束日期都早于等于目标日期,但eventId=1的dueDate是2018-01-17,大于你要筛选的截止日期2018-01-16,所以这条记录被排除了,这就是你只得到eventId=3的原因。
正确的时间段重叠判断逻辑
要筛选出与目标时间段[2018-01-14, 2018-01-16]有重叠的事件,核心逻辑是:
事件的开始日期 ≤ 目标时间段的结束日期,并且事件的结束日期 ≥ 目标时间段的开始日期
这个逻辑能覆盖所有重叠场景:比如事件完全在目标时段内、事件跨目标时段的开始/结束点、甚至事件完全包含目标时段。
正确的SQL语句
SELECT eventId FROM events WHERE startDate <= '2018-01-16' AND dueDate >= '2018-01-14';
验证结果
我们来逐个核对数据:
- eventId=1:
startDate=2018-01-15 ≤ 2018-01-16,且dueDate=2018-01-17 ≥ 2018-01-14→ 符合条件 - eventId=2:
startDate=2018-01-25 > 2018-01-16→ 不符合 - eventId=3:
startDate=2018-01-11 ≤ 2018-01-16,且dueDate=2018-01-16 ≥ 2018-01-14→ 符合条件
正好得到你预期的eventId 1和3的结果。
内容的提问来源于stack exchange,提问作者Ganesh M
相关产品推荐
相关产品推荐

