确定记录集之间的重叠时间

时间:2015-06-03 18:44:33

标签: sql sql-server sql-server-2012

我需要通过时间戳来比较两组数据。我需要确定一名工作人员与特定房间的病人在一起的时间。最初,我们被告知患者首先到达房间,是最后一个离开的房间。现在不是在查看我们的数据。这是我们使用的查询:

Select... 
Inner Join Staff on Staff.LocationId = Patient.LocationId 
Where Staff.StartTime >= Patient.StartTime and Staff.EndTime <= Patient.EndTime

虽然此查询适用于这些情况,但有时员工已经在房间内,可能会在以后或之前离开。我们想要收集的是两个人在房间里不再在一起的时间。

鉴于以下示例,工作人员已经在病人面前。工作人员在病人离开前离开。

PatientId LocationId LocationName StartTimeInRoom         EndTimeInRoom
========= ========== ============ ===============         =============
7109      19         Testing      2015-05-19 10:02:11.483 2015-05-19 10:36:24.617

UserId LocationId LocationName StartTimeInRoom         EndTimeInRoom
====== ========== ============ ===============         =============
27     19         Testing      2015-05-19 10:00:11.900 2015-05-19 10:03:41.547  

期望的结果如下:

PatientId UserId LocationId LocationName TimeWithPatient StartTimeInRoom         EndTimeInRoom
========= ====== ========== ============ =============== ===============         =============
7109      27     19         Testing      90              2015-05-19 10:02:11.483 2015-05-19 10:03:41.547

所以上述情况是工作人员已经在房间里。因此,我们可以使用患者进入房间的时间,直到工作人员离开。

我遇到的问题是弄清楚是否有重叠,如果患者和工作人员之间存在重叠,那么确定他们访问的日期。

我尝试为每个方案创建单独的查询,但它无法帮助我确定重叠。

更新: 我想知道这是否有效:

Select...
Inner Join Staff on Staff.LocationId = Patient.LocationId 
where (Staff.StartTime BETWEEN Patient.StartTime and Patient.EndTime) 
      or (Patient.StartTime between Staff.StartTime and Staff.EndTime)

2 个答案:

答案 0 :(得分:4)

您可以在join条件中使用不等式来获得重叠。然后使用case获取最早和最晚的时间:

Select (case when p.StartTime > s.StartTime then p.StartTime else s.StartTime
        end) as StartTime,
       (case when p.EndTime < s.EndTime then p.EndTime else s.EndTime
        end) as EndTime
from Patient p Inner Join
     Staff s
     on s.LocationId = p.LocationId qne
        s.StartTime <= p.EndTime and s.EndTime >= p.StartTime;

注意:如果患者和/或工作人员多次进入房间而没有另一个人离开,那么这将产生从第一次到最后一次的最长时间。如果这是一个问题,请向另一个问题询问样本数据和所需结果。

答案 1 :(得分:0)

with cte (startime,endtime)
as
(
select
(select top 1 startime from staff where staffid = 27 and locationid = 19
and startime > '2015-05-18' order by startime),
(select top 1 endtime from staff where staffid = 27 and locationid = 19 and
startime > '2015-05-18' order by endtime desc)
)
select * from cte

如果我正朝着正确的方向前进,请告诉我,这段代码的作用是当天工作人员第一次进入房间时(让我们说我们在19/05/2015查询数据库) )并且他们最后一次离开...使用内部连接可以修改以显示当病人在那里时工作人员进入房间的第一次和最后一次。我意识到它可能必须以相反的方式工作(即工作人员首先进入)和各种组合,但这些都可以合并到这个的修改版本中。当然我们只处理从第二个人进入房间,进入房间,到第一个人离开房间,离开房间的时间,只有时间加起来没有困难如果你愿意,他们一起在房间里......