SQL查询一个表中的所有日期范围,而不是给定外键的另一个表的任何日期范围

SQL查询一个表中的所有日期范围,而不是给定外键的另一个表的任何日期范围,sql,Sql,虽然我检查了其他关于重叠日期范围的帖子,但我还没有找到解决这个问题的帖子 我有两个表,一个用于成员的属性历史 MEMBERCODE | START_DATE | END_DATE | ATTRIBUTE 423223 | 10/01/2020 | 12/31/9999 | Dual 423223 | 11/01/2020 | 11/30/2020 | Cost Share 然后,每个成员的成员资格或注册跨度历史记录都有另一个表 M

虽然我检查了其他关于重叠日期范围的帖子,但我还没有找到解决这个问题的帖子

我有两个表,一个用于成员的属性历史

MEMBERCODE |   START_DATE   |   END_DATE    | ATTRIBUTE

423223     |   10/01/2020   |  12/31/9999   | Dual
423223     |   11/01/2020   |  11/30/2020   | Cost Share
然后,每个成员的成员资格或注册跨度历史记录都有另一个表

MEMBERCODE |   EFFECTIVE_DATE |  TERM_DATE  |  PLAN_PRODUCT

423223     |   11/01/2020     |  12/31/9999 |  Foo
423223     |   09/01/2020     |  09/30/2020 |  Bar
成员的最新属性范围应始终位于成员的最新注册范围内,但每个注册范围可以有多个属性

问题是我想从成员的历史记录中查找所有属性范围,这些属性范围不完全位于成员历史记录中的任何注册范围内。 例如,对于此属性范围: 2020年10月1日1999年12月31日**该成员的任何注册期内均无10/1期。它属于一个间隔期

SELECT a.MEMBER_NBR, a.START_DATE, A.END_DATE,B.EFFECTIVE_DATE ,B.TERM_DATE,
A.ATTRIBUTE,B.PLAN_PRODUCT
FROM Attribute_Spans A
JOIN Enrollment_Spans B ON A.MemberCode = B.MemberCode
WHERE ((A.Start_Date NOT BETWEEN B.Effective_Date and B.End_Date) AND (A.End_date NOT BETWEEN 
B.Effective_Date and B.End_Date))
AND A.MemberCode = B.MemberCode
这不起作用,因为它确实查找不在某个注册范围内但该属性范围确实在该特定成员的另一个注册范围内的属性日期范围

我得到了什么

MEMBER_CODE | START_DATE | END_DATE   | EFFECTIVE_DATE | TERM_DATE  | ATTRIBUTE | PLAN_PRODUCT
423223      | 10/01/2020 | 12/31/2020 | 09/01/2020     | 09/30/2020 | Dual      | Bar
423223      | 10/01/2020 | 12/31/2020 | 11/01/2020     | 12/31/2020 | Dual      | Foo
423223      | 11/01/2020 | 11/30/2020 | 09/01/2020     | 09/30/2020 | Cost Share| Bar
我所期望的

MEMBER_CODE | START_DATE | END_DATE   | EFFECTIVE_DATE | TERM_DATE  | ATTRIBUTE | PLAN_PRODUCT
423223      | 10/01/2020 | 12/31/2020 | 09/01/2020     | 09/30/2020 | Dual      | Bar
423223      | 10/01/2020 | 12/31/2020 | 11/01/2020     | 12/31/2020 | Dual      | Foo
一些用于制作表格的起始代码

CREATE TABLE Attribute_Spans (
MemberCode int,
StartDate date,
EndDate date,
Attribute char(50)
)
INSERT INTO Attribute_Spans (MemberCode,StartDate,EndDate,Attribute)
VALUES (423223,'10/01/2020','12/31/9999','Dual'),
        (423223,'11/01/2020','11/30/2020','Cost Share')

CREATE TABLE Enrollment_Spans (
    MemberCode int,
    Effective_Date date,
    End_Date date,
    PlanProduct char(50)
    )
INSERT INTO Enrollment_Spans (MemberCode,Effective_Date,End_Date,Plan_Product)
VALUES (423223,'09/01/2020','09/30/2020','Foo'),
        (423223,'11/01/2020','12/30/2020','Bar')
不存在以下用途:

如果一个时间段先于另一个时间段开始,则两个时间段重叠。一个在另一个开始后结束


<>这不考虑在相同日期结束/开始作为重叠。如果你想让它算数,那么改变>和=并谢谢。是否可以加入此子查询以便查看注册跨度日期?@BenSmith。这有点尴尬,因为这个查询在没有重叠的情况下返回行。也许你应该问另一个问题,更清楚地说明你想从这两个表中显示哪些行。只需要有效日期和结束日期列,并在MemberCode上连接。我猜它将为属性生成重复的值,因为它将连接到所有跨行。我想我应该做一个临时的结果表然后join@BenSmith . . . 我建议您提出一个新问题,并提供适当的样本数据和期望的结果。
select a.*
from attribute_spans a
where not exists (select 1
                  from Enrollment_Spans es
                  where es.membercode = a.membercode and
                        a.end_date > es.effective_date and
                        a.start_date < es.end_date 
                 );