如何在Oracle中找到差异b / w TIMESTAMP格式值?

时间:2013-07-01 20:28:26

标签: oracle timestamp

我有两个timestamp列:arrTimedepTime。 我需要找到公共汽车迟到的人数。 我尝试了以下方法:

SELECT RouteDate, round((arrTime-depTime)*1440,2) time_difference
FROM ...

我收到以下错误:inconsistent datatype . expected number but got interval day to second

我如何解析分钟的nuber?

如果我简单地减去:SELECT RouteDate, arrTime-depTime)*1440 time_difference 结果是正确的,但格式不正确:

 time_difference
  +00000000 00:01:00 0000000

3 个答案:

答案 0 :(得分:12)

时间戳算法的结果是INTERVAL数据类型。那里有INTERVAL DAY TO SECOND ......

如果您希望使用EXTRACT(),则需要一分钟的分钟数,例如:

select extract( minute from interval_difference ) * 60 
        + extract( hour from interval_difference ) * 60
        + extract( day from interval_difference ) * 60 * 24
  from ( select systimestamp - (systimestamp - 1) as interval_difference
           from dual )

或者你可以使用日期技巧:

select sysdate + (interval_difference * 1440) - sysdate
  from (select systimestamp - (systimestamp - 1) as interval_difference
          from dual )

“技巧”版本的工作原因是operator order of precedence以及日期和时间戳算术之间的差异。

最初的操作如下:

date + ( interval * number ) - date

如文档中所述:

  

Oracle在评估外部的表达式之前评估括号内的表达式。

因此,第一次操作将间隔乘以1,440。间隔,即离散的时间段,乘以数字是另一个离散的时间段see the documentation on datetime and interval arithmetic。所以,这个操作的结果是一个间隔,留给我们:

date + interval - date

plus运算符优先于减号。原因可能是间隔减去日期是一个无效的操作,但文档也暗示这是这种情况(不出来并说出来)。因此,执行的第一个操作是日期+间隔。日期加上间隔是日期。离开

date - date

根据文档,这会产生一个表示天数的整数。但是,您将原始间隔乘以1,440,因此现在这个数量是原来的天数的1,440倍。然后你会得到秒数。

这是worth noting that

  

当间隔计算返回日期时间值时,结果必须是实际的日期时间值,否则数据库将返回错误。例如,接下来的两个语句返回错误:

“技巧”方法失败,但很少会失败。一如既往,最好这样做。

答案 1 :(得分:1)

SELECT (arrTime - depTime) * 1440 time_difference
  FROM Schedule
 WHERE ...

这会让你在几分钟内得到时差。当然,你可以做任何你可能需要的四舍五入的整个时间......

答案 2 :(得分:1)

转换为DATE首先将差异作为数字返回,至少与我尝试过的Oracle版本一致。

round((cast(arrTime as date) - cast(depTime as date))*1440)

您可以使用TO_CHAR然后转换回数字。我从未测试过与EXTRACT相比的性能,但该语句适用于两个日期而不是符合我需要的区间。

秒:

(to_char(arrTime,'J')-to_char(depTime,'J'))*86400+(to_char(arrTime,'SSSSS')-to_char(depTime,'SSSSS'))

分:

round((to_char(arrTime,'J')-to_char(depTime,'J'))*1440+(to_char(arrTime,'SSSSS')-to_char(depTime,'SSSSS'))/60)

J是朱利安日,SSSSS是白天。他们一起在几秒钟内给出绝对时间。