2014-05-12 41 views
2

我期待以天/小时/分钟为单位计算两个日期之间的差异。Oracle中同一列中两个日期之间的差异以天/小时/分钟为单位

我有一个表数据结构如下:

ID     Date       Location   Type 
--------------------------------------------------------------------------------- 
42ABC   15-NOV-14 12.45.00 PM     YY   Departed 
42ABC   15-NOV-14 03.10.00 PM     AA   Arrived 
42ABC   18-NOV-14 05.15.00 PM     AA   Departed 
42ABC   18-NOV-14 07.20.00 PM     YY   Arrived 

如何计算的差异日期,并获得这样的:

ID    Location     DURATION 
----------------------------------------------------------------- 
42ABC    AA     3 days, 2 hours, 5 minutes 

我很欣赏你在此输入。

回答

1

,想到的第一个解决方案是:

SELECT id, 
     location, 
      TRUNC (date_diff) 
     || ' days, ' 
     || TRUNC ((date_diff - TRUNC (date_diff)) * 24) 
     || ' hours, ' 
     || MOD ((date_diff - TRUNC (date_diff)) * 24, 10) * 60 
     || ' minutes' 
FROM (SELECT id, location, MAX (date) - MIN (date) AS date_diff 
     FROM  your_table 
     GROUP BY id, location) 

当你减去在Oracle中两个日期,结果是一个表示天数的十进制数,所以它从那里只是数学拿出小时和分钟。如果你想让它变得更加复杂(例如,如果数字为零,则删除部分),那么我建议使用一个函数。

它也可以是能够通过从date转换为使用稍微简单的解决方案,以timestamp,其产生interval类型的结果,而不是一个decimal


interval溶液:

SELECT id, 
     location, 
      EXTRACT (DAY FROM date_diff) 
     || ' days, ' 
     || EXTRACT (HOUR FROM date_diff) 
     || ' hours, ' 
     || EXTRACT (MINUTE FROM date_diff) 
     || ' minutes' 
FROM (SELECT id, location, 
       CAST(MAX (date) as timestamp) 
       - CAST(MIN (date) as timestamp) AS date_diff 
     FROM  your_table 
     GROUP BY id, location) 
0

这可以是确定:

select T1.ID, T2.LOCATION, round(T2.DDATE - T1.DDATE) || ' days, ' || 
      trunc(mod((T2.DDATE - T1.DDATE)*24, 24)) || ' hours, ' || 
      trunc(mod((T2.DDATE - T1.DDATE)*24*60, 60)) || ' minutes' duration 
from YOUR_TABLE T1, YOUR_TABLE T2 
where T2.ID = T1.ID 
    and T2.LOCATION = T1.LOCATION 
    and T1.TYPE = 'Arrived' 
    and T2.TYPE = 'Departed' 
; 
相关问题