首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SQL查找两个日期范围之间的重复活动记录

SQL查找两个日期范围之间的重复活动记录
EN

Stack Overflow用户
提问于 2019-06-27 17:36:53
回答 2查看 576关注 0票数 0

我有两个表,一个患者表和一个保险表。一个病人可以有多个保险。我正在尝试查找所有具有重叠有效日期或显示两个有效日期为有效日期的保险。

代码语言:javascript
复制
PATID    START_DTTM           END_DTTM
1        2002-09-10 00:00:00.000  NULL
1        2007-03-06 10:18:00.000  2019-04-11 11:59:00.000

如果END_DTTM为空,则它是活动的。开始日期应从随后的结束日期结束时开始。我正在尝试查找活动日期重叠的所有条目,或者如果有意义的话,它会显示一个期间内的两个活动条目?

此外,为了使一个患者可以拥有多个保险,上面的示例显示了一个具有两个保险详细信息的患者。他们也可以有第三或第四个条目...

任何帮助都是最好的

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-06-27 18:28:22

这将列出至少有一个其他保险重叠的所有保险。

代码语言:javascript
复制
select ID, PATID, START_DTTM, END_DTTM
from insurances i1
where exists (select null 
              from insurances i2
              where i1.ID != i2.ID and i1.PATID = i2.PATID
                and (i1.START_DTTM  <= i2.END_DTTM or i2.END_DTTM is null)
                and (i2.START_DTTM  <= i1.END_DTTM or i1.END_DTTM is null)
             )
order by PATID, START_DTTM;

两个有效保险(结束日期为空)被视为重叠。如果相等的开始/end日期不被视为重叠,您可能希望将<=更改为<

票数 1
EN

Stack Overflow用户

发布于 2019-06-27 17:49:59

如果您的保险表格对于每个保险也有一个惟一的id (我们希望如此),那么您可以有一个如下所示的查询

代码语言:javascript
复制
declare @tab table (
    patid int
    , insid int
    , start_dttm datetime
    , end_dttm datetime
)

insert into @tab values (1, 8, '2002-09-10', NULL)
                        , (1, 9, '2007-03-06', '2019-04-11')
                        , (53, 321513, '2015-01-13', NULL )
                        , (53, 11, '2008-08-14', '2015-01-13')
                        , (54, 12, '2015-01-13', NULL )
                        , (54, 13, '2008-08-14', '2015-01-12')

select      a.*
            , b.*
            , 'Insurance record ' + cast(b.insid as varchar) + ' (' + convert(varchar,b.start_dttm,103) + ' to ' + convert(varchar,b.end_dttm,103) + ') '
             + 'overlaps Insurance record ' + cast(a.insid as varchar) + ' (' + convert(varchar,a.start_dttm,103) + isnull(' to ' + convert(varchar,a.end_dttm,103), ' still active') + ')'

from        @tab a
inner join  @tab b
on          a.patid = b.patid
and         a.insid != b.insid
where       (b.start_dttm > a.start_dttm and b.start_dttm < isnull(a.end_dttm, getdate()+1))
or          (b.end_dttm > a.start_dttm and b.start_dttm < isnull(a.end_dttm, getdate()+1))
or          (a.end_dttm is null and b.end_dttm is null)

注意-您不需要像我一样创建一个表变量@tab,只需使用您的保险表即可。

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

https://stackoverflow.com/questions/56788154

复制
相关文章

相似问题

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