【问题标题】:Finding overlapping intervals using SQL使用 SQL 查找重叠区间
【发布时间】:2011-01-27 12:33:09
【问题描述】:

我想从间隔与查询中指定的间隔相交的表中提取行。假设我有一个简单的ID, DATE_START, DATE_END 表和两个查询参数P_DATE_STARTP_DATE_END,那么表达查询的最简单方法是什么,以便我找到[DATE_START, DATE_END] 至少有一个与@ 共同元素的所有行987654326@?


更新:

为了使期望的结果更清楚,请在下面找到输入值和预期结果的列表。列是DATE_START, DATE_END, P_DATE_START, P_DATE_END, MATCH

16, 17, 15, 18, YES
15, 18, 16, 17, YES
15, 17, 16, 18, YES
16, 18, 15, 17, YES
16, 17, 18, 19, NO
18, 19, 16, 17, NO

【问题讨论】:

标签: sql


【解决方案1】:

更简单:

SELECT id, date_start, date_end 
FROM thetable 
WHERE date_start <= p_date_end 
AND date_end >= p_date_start

【讨论】:

  • 谢谢,我也试过了。当[date_start, date_end] 完全包含在[p_date_start, p_date_end] 中时,这不起作用。
  • @Robert,确实如此!例如,如果 [5,6] 完全包含在 [1,10] 中,那么 5 = 1 是真的。
  • @Ilya:请查看我的问题更新。检查应该是对称的,即如果它与输入[5,6] 和行值[1, 10] 一起使用,它应该与输入[1,10] 和行值[5,6] 一起使用。
  • @Robert 那么你能给我一个这个查询失败的数据示例吗?
  • 尝试以下(在 MySQL 上测试)create table intervals ( id bigint unsigned, date_start date, date_end date); insert into intervals(id, date_start, date_end) VALUES ( 1, '2011-01-05', '2011-01-06'); select id from intervals where date_start &lt;= '2011-01-01' and date_end &gt;= '2011-01-10';
【解决方案2】:

根据您的 dbms,您可能可以使用 OVERLAPS 运算符。

select * from your_table
where (date '2011-01-15', date '2011-01-18') overlaps (date_start, date_end)

【讨论】:

    【解决方案3】:

    选择 id、date_start、date_end 从表 哪里不是(date_end

    【讨论】:

    • 谢谢,这是我的第一次尝试。它不能解决[p_date_start, p_date_end] 完全包含在[date_start, date_end] 中的问题。它们相交,但查询不返回。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-01-28
    • 1970-01-01
    • 1970-01-01
    • 2013-08-17
    • 1970-01-01
    • 1970-01-01
    • 2014-11-07
    相关资源
    最近更新 更多