首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在SQL中查找具有时间间隔重叠的行的简单而有效的方法是什么?

在SQL中查找具有时间间隔重叠的行的简单而有效的方法是什么?
EN

Stack Overflow用户
提问于 2008-09-22 22:16:06
回答 5查看 40.4K关注 0票数 35

我有两个表,都有开始时间和结束时间字段。对于第一个表中的每一行,我需要查找第二个表中时间间隔相交的所有行。

例如:

代码语言:javascript
复制
           <-----row 1 interval------->
<---find this--> <--and this--> <--and this-->

请以SQL WHERE-clause的形式表述您的答案,并考虑第二个表中的结束时间可能为NULL的情况。

目标平台是SQL Server 2005,但也可能对其他平台的解决方案感兴趣。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2008-09-22 22:20:06

代码语言:javascript
复制
SELECT * 
FROM table1,table2 
WHERE table2.start <= table1.end 
AND (table2.end IS NULL OR table2.end >= table1.start)
票数 63
EN

Stack Overflow用户

发布于 2020-05-16 17:40:52

“来自其他平台的解决方案可能也会感兴趣。

SQL标准定义了谓词:

指定两个事件之间重叠的测试。

::= <行值构造函数1>重叠<行值构造函数2>

示例:

代码语言:javascript
复制
SELECT 1
WHERE ('2020-03-01'::DATE, '2020-04-15'::DATE) OVERLAPS 
      ('2020-02-01'::DATE, '2020-03-15'::DATE) 
-- 1
票数 2
EN

Stack Overflow用户

发布于 2008-09-22 22:25:54

代码语言:javascript
复制
select * from table_1 
right join 
table_2 on 
(
table_1.start between table_2.start and table_2.[end]
or
table_1.[end] between table_2.start and table_2.[end]
or
(table_1.[end] > table_2.start and table_2.[end] is null)
)

编辑:好的,不要用我的解决方案,它像狗屎一样完美。"where“解决方案的速度要快14倍。哦..。

一些统计数据:在数据库上运行,表1和表2都有大约65000条记录(没有索引),每行的开始和结束间隔为2天,在SQLSMSE中运行2分钟(没有耐心等待)

使用join: 2分钟内有8356行

使用where: 2分钟内115436行

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/117962

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档