使用SQL查找重叠的时间区间

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

更新:

为了使期望的结果更清晰,请在下面找到输入值和预期结果列表。列分别是 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

1
https://dev59.com/KXVC5IYBdhLWcg3w7V1q#143568 - Martin Smith
@Martin:这似乎正是我正在寻找的,谢谢!如果是这样的话,我会投票关闭我的问题。 - Robert Munteanu
3个回答

7
更简单的方法是:
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 Munteanu
@Robert,是的!例如,如果[5,6]完全包含在[1,10]中,则5 <= 10并且6> = 1是成立的。 - Ilya Kogan
@Ilya:请查看我的问题更新。检查应该是对称的,即如果它适用于输入[5,6]和行值[1,10],那么它应该适用于输入[1,10]和行值[5,6] - Robert Munteanu
@Robert,你能给我一个这个查询失败的数据示例吗? - Ilya Kogan
尝试以下代码(在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 <= '2011-01-01' and date_end >= '2011-01-10';以上是创建名为intervals的表,插入一条记录并查询符合条件的记录。 - Robert Munteanu
@Robert,你把p_date_start和p_date_end搞混了。正确应该是:select id from intervals where date_start <= '2011-01-10' and date_end >= '2011-01-01' - Ilya Kogan

3

根据您的数据库管理系统,您可能能够使用OVERLAPS运算符。

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

2

选择id、date_start和date_end从thetable中 其中不包括(date_end < p_date_start 或 p_date_end < date_start )的数据


谢谢,那是我的第一次尝试。它没有解决 [p_date_start, p_date_end] 完全包含在 [date_start, date_end] 中的问题。它们相交,但查询不返回结果。 - Robert Munteanu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接