[英]How to generate date ranges in SQL, given any To_date to to_date from given table?
[英]SQL querying all date ranges from one table not between any date ranges of another for given foreign key
虽然我检查了其他关于重叠日期范围的帖子,但我还没有找到解决这个问题的帖子。
我有两个表,一个用于成员的 Attribute_spans 历史记录
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
成员最新的属性范围应始终在成员最近的注册范围内,但每个注册范围可以有多个属性。
问题是我想从成员的历史中找到所有属性跨度,这些跨度不完全位于他们历史中的任何注册跨度内。
例如对于这个属性跨度:
10/1/2020 12/31/9999 ** 在该成员的任何注册跨度内没有 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')
使用not exists
:
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
);
如果一个时间段在另一个时间段之前开始,则两个时间段会重叠。 一个在另一个开始后结束。
这不会将在同一日期结束/开始视为重叠。 如果您希望计数,请将>
和<
更改为>=
和<=
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.