需要识别重叠的日期

时间:2020-02-04 00:21:37

标签: sql sql-server

我需要查找表格的重叠日期。因此,基本结构是ID,PFX,开始日期和结束日期。因此,给定ID的PFX与每个ID的另一个PFX重叠。

我尝试了这个,没有运气。 https://www.sqlservercentral.com/forums/topic/how-to-extract-overlapping-date-ranges-from-a-table-of-date-ranges

突出显示的是我想显示为重叠的部分。

enter image description here

Drop table #zzz_Overlapping
CREATE TABLE #zzz_Overlapping(

    [ID] [varchar](500) NULL,

    [PFX] [varchar](500) NULL,

    [EFF_DT] [datetime] NULL,

    [TERM_DT] [datetime] NULL

) ON [PRIMARY]

GO

insert into #zzz_Overlapping (ID,PFX,EFF_DT,TERM_DT)

values ( 123,'ABDM','1997-06-01','9999-12-31')

insert into #zzz_Overlapping (ID,PFX,EFF_DT,TERM_DT)

values ( 123,'ABDM','1997-10-01','9999-12-31')

insert into #zzz_Overlapping (ID,PFX,EFF_DT,TERM_DT)

values ( 123,'CSM1','1997-11-01','9999-12-31')

insert into #zzz_Overlapping (ID,PFX,EFF_DT,TERM_DT)

values ( 123,'CSM1','1998-01-01','9999-12-31')

insert into #zzz_Overlapping (ID,PFX,EFF_DT,TERM_DT)

values ( 123,'ABDD','1999-01-01','9999-12-31')

insert into #zzz_Overlapping (ID,PFX,EFF_DT,TERM_DT)

values ( 417,'CSM1','2001-06-01','9999-12-31')

insert into #zzz_Overlapping (ID,PFX,EFF_DT,TERM_DT)

values ( 417,'CSM1','2001-10-01','9999-12-31')

insert into #zzz_Overlapping (ID,PFX,EFF_DT,TERM_DT)

values ( 417,'CSM2','2001-11-01','9999-12-31')

select * from #zzz_Overlapping

select CONCAT(ID, PFX) FROM #zzz_Overlapping

SELECT A.*

FROM #zzz_Overlapping A

JOIN #zzz_Overlapping B

    ON B.ID = A.ID

    AND ((A.EFF_DT BETWEEN B.EFF_DT AND B.TERM_DT)

    OR (A.TERM_DT BETWEEN B.EFF_DT AND B.TERM_DT))

WHERE B.EFF_DT != A.EFF_DT OR B.TERM_DT != A.TERM_DT;


SELECT A.ID, A.PFX, A.EFF_DT, A.TERM_DT, B.PFX, B.EFF_DT, B.TERM_DT

FROM #zzz_Overlapping A

INNER JOIN #zzz_Overlapping B

    ON B.ID = A.ID

    AND B.EFF_DT < A.TERM_DT

    AND A.EFF_DT < B.TERM_DT
    AND A.EFF_DT < B.EFF_DT;

添加此内容是为了澄清预期结果。 Desired outcome would show the 3 rows would be overlapping.  The keys are the ID AND PFX.

2 个答案:

答案 0 :(得分:1)

您似乎想要:

select o.*
from #zzz_Overlapping o
where exists (select 1
              from #zzz_Overlapping o2
              where o2.id = o.id and
                    o2.prefix = o.prefix and
                    o2.eff_dte < o.end_dte and
                    o2.end_dte > o.eff_dte
             );

答案 1 :(得分:1)

根据戈登的回答,您可以检查以下内容吗?

with data
  as (select row_number() over(order by (select null)) as rnk
            ,*
         from #zzz_overlapping
      )
select o.*
  from data o
 where exists (select 1
                 from data o2
                where o2.id = o.id and
                    o2.PFX = o.PFX and
                    o2.EFF_DT <= o.TERM_DT and
                    o2.TERM_DT >= o.EFF_DT and
                    o2.rnk <> o.rnk
             )

dbfiddle链接。 https://dbfiddle.uk/?rdbms=sqlserver_2019&fiddle=11f4e9dc6bd96df6f0c8145df0b953a8