用于比较不同行中的日期字段并组合结果的SQL代码

时间:2013-04-01 22:12:16

标签: sql oracle crystal-reports

我需要帮助正确的Oracle SQL代码来组合crystal reports命令对象的行。这是我正在处理的更大查询的一部分,并在过去几天陷入困境。

例如。如果列如下所示

PatId   In_time                     Out_time  
151     01/01/2012 07:00:00 am      01/01/2012 10:00:00 am
151     01/01/2012 11:00:00 am      01/02/2012 08:00:00 am 
151     01/02/2012 11:00:00 am      01/02/2012 01:00:00 pm
151     01/03/2012 08:00:00 am      01/03/2012 03:00:00 pm
151     01/06/2012 03:30:00 pm      01/09/2012 07:00:00 am
167     01/03/2012 01:30:00 pm      01/09/2012 07:00:00 am
167     01/13/2012 03:30:00 pm      01/14/2012 07:00:00 am
167     01/14/2012 11:30:00 am      01/15/2012 11:30:00 am
167     01/18/2012 12:00:00 pm      01/19/2012 03:00:00 am

在PatId中,代码应该将一行的Out_time与下一行的In_time进行比较,并检查时间间隔是否大于48小时。如果没有,那么它被认为是同一次访问的一部分。我想要每个PatID和一个结果行。访问,使用min(In_time)和max(Out_time)。访问的时间跨度(结果行)本身可能超过48小时。

对于该示例,对于PatId 151,第一行的out_time和第二行的In_time之间的时间差小于48小时。第二行的Out_time和第三行的In_time之间以及第3行和第4行之间的差异也小于48小时。在此之后,第4行的Out_time和第5行的In_time之间的间隔大于48小时。对于EmpId 167,PatId 151的结果应该如下所示,链接应该继续,直到找到大于48小时的间隙。

因此上表的结果应显示为

PatId     In_time                          Out_time  
151     01/01/2012 07:00:00 am      01/03/2012 03:00:00 pm
151     01/06/2012 03:30:00 pm      01/09/2012 07:00:00 am
167     01/03/2012 01:30:00 pm      01/09/2012 07:00:00 am
167     01/13/2012 03:30:00 pm      01/15/2012 11:30:00 am
167     01/18/2012 12:00:00 pm      01/19/2012 03:00:00 am

我无法获得如何比较和合并行的逻辑。

先谢谢,Abhi

1 个答案:

答案 0 :(得分:0)

减去时间的一般示例 - 复制/粘贴以查看输出。此示例将为您提供两个日期之间的小时,分​​钟,秒的差异。基本公式是(end_date - start_date)* 86400(24小时内的秒数)......:

SELECT trunc(mydate / 3600) hr
     , trunc(mod(mydate, 3600) / 60) mnt
     , trunc(mod(mydate, 3600) / 60 /60) sec
  FROM 
  (
   SELECT (to_date('01/03/2012 10:00:00', 'mm/dd/yyyy  hh24:mi:ss') -
           to_date('01/01/2012 07:00:00', 'mm/dd/yyyy  hh24:mi:ss')) * 86400 mydate
     FROM dual
  )
 /

 HR | MNT | SEC
 ---------------
 51 |  0  |  0

您需要检查您的示例和逻辑。我无法理解什么需要与什么相结合......