Sql 如何检查是否存在日期重叠?

Sql 如何检查是否存在日期重叠?,sql,sql-server,sql-server-2008,sql-server-2008-r2,Sql,Sql Server,Sql Server 2008,Sql Server 2008 R2,试图找出两种或两种以上药物是否有60天和30天的供应重叠。下表列出了人员姓名、填充/重新填充日期、药品ID和供应日期 这些药物25605和25700的红色高亮日期重叠60天供应 如何构造SQL以确定是否存在至少60天的重叠? 如有任何建议,将不胜感激。 非常感谢。 这种类型的计算在SQL Server中很麻烦,因为日期函数很笨重,并且没有最小值或最大值函数 但是,你可以做到。它本质上是一个带有聚合的自连接。关键的想法是确定重叠的天数。重叠期的开始和结束时间为dos或dos+供应天数。这只是一个复

试图找出两种或两种以上药物是否有60天和30天的供应重叠。下表列出了人员姓名、填充/重新填充日期、药品ID和供应日期

这些药物25605和25700的红色高亮日期重叠60天供应

如何构造SQL以确定是否存在至少60天的重叠? 如有任何建议,将不胜感激。 非常感谢。

这种类型的计算在SQL Server中很麻烦,因为日期函数很笨重,并且没有最小值或最大值函数

但是,你可以做到。它本质上是一个带有聚合的自连接。关键的想法是确定重叠的天数。重叠期的开始和结束时间为dos或dos+供应天数。这只是一个复杂的案例陈述:

select t.member, t.drug_id, t2.drug_id,
       sum(datediff(day, (case when t.dos <= t2.dos then t2.dos else t.dos end),
                    (case when dateadd(day, t.days_supply, t.dos) <= dateadd(day, t2.days_supply, t2.dos)
                          then dateadd(day, t.days_supply, t.dos)
                          else dateadd(day, t2.days_supply, t2.dos)
                     end)
           ) as days_overlap
from table t join
     table t2
     on t.member = t2.member and t.drug_id < t2.drug_id and
        t.dos between dateadd(day, -t.days_supply, t2.dos) and
                      dateadd(day, t2.days_supply, t2.dos)
group by t.member, t.drug_id, t2.drug_id;
代码可能有一个一个接一个的错误-重叠总是有点混乱,但是一些真实的数据通常会很快清除


注:这假设药物不会与自身重叠。这是一个重要的假设;否则,重叠的天数将被计算过多。

一种简单的方法,您可以通过部分来建立它,是这样的:

select  s1.Member, s2.DOS, s1.Drug_ID [First Drug], s2.Drug_ID [Second Drug]
from    Stream s1
join    Stream s2
    on  s2.Member   = s1.Member
    and s2.Drug_ID  > s1.Drug_ID
    and DateDiff( Day, s1.DOS, s2.DOS ) between 0 and 60
group by s1.Member, s2.DOS, s1.Drug_ID, s2.Drug_ID
having Sum( s1.Days_Supply ) >= 60;
比较s2.Drug_ID>s1.Drug_ID消除了将药物A与药物B进行比较以及再次将药物B与药物A进行比较所造成的双重打击。DateDiff将比较限制为过去60天内相对于所检查填充物的填充物

这将从您提供的数据流中生成一行:

Member DOS        First Drug  Second Drug
------ ---------- ----------- -----------
Joe    06/25/2015 25605       25700
这意味着2015年6月25日药物25700的药物填充导致与药物25605重叠60天。当然,由于两次填充都发生在同一天,你也可以说是药物25605的填充导致了重叠,但由于这是一个没有真正区别的区别,这并不重要。对照真实数据进行检查,确保其产生相关结果


一个重要的假设是,当同一种药物再次被储存时,将不会有剩余剂量的药物。当然,您可能无法确定这一点。

在SQL Server 2012+中,这会更容易。您是否可以使用更新版本的SQL Server?另外,重叠是否必须是连续的?嗨,Gordon Linoff,我也可以使用sql server 2012。你能提供一些方向吗?谢谢你可能的副本。至少,那里有有用的信息。主要区别在于这个问题中的“60天”要求。嗨,戈登,我真的很感激。你能帮我理解每行代码都在做什么吗。我试图将其分解并逐段理解,但未能消化:对我来说,这是一段复杂的SQL代码。谢谢关于时间间隔的查询通常相当复杂。我建议您生成一些样本数据,并在没有分组的情况下查看结果。这将让您了解数据是如何组合的。谢谢。我也会测试一下。但是我怎么能在这里工作呢?你能更新一下吗?谢谢你的建议。我不确定你到底想看什么。嗨,汤姆,我想知道如果在同一时期服用两种或更多药物,重叠的天数。在这个特定的例子中,基于DOS的服务天数,我想知道这两种药物重叠了多少天。您指定60天重叠,而您只回顾60天。所以唯一可能的结果就是60。如果你愿意,你可以硬编码。