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

我想从间隔与查询中指定的间隔相交的表中提取行。假设我有一个简单的ID, DATE_START, DATE_END 表和两个查询参数P_DATE_START 和P_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
    相关资源
    最近更新 更多