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

Bur*_*ras 3 oracle timestamp

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

SELECT RouteDate, round((arrTime-depTime)*1440,2) time_difference
FROM ...
Run Code Online (Sandbox Code Playgroud)

我收到以下错误: 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
Run Code Online (Sandbox Code Playgroud)

Ben*_*Ben 12

时间戳算术的结果是INTERVAL数据类型.那里有第二天间隔 ......

如果您想要使用一种方式的分钟数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 )
Run Code Online (Sandbox Code Playgroud)

或者,您可以使用日期技巧:

select sysdate + (interval_difference * 1440) - sysdate
  from (select systimestamp - (systimestamp - 1) as interval_difference
          from dual )
Run Code Online (Sandbox Code Playgroud)

"技巧"版本的工作原理是运算符的优先顺序以及日期和时间戳算术之间的差异.

最初操作如下所示:

date + ( interval * number ) - date
Run Code Online (Sandbox Code Playgroud)

如文档中所述:

在评估外部的表达式之前,Oracle会对括号内的表达式求值.

因此,第一个操作执行它以将间隔乘以1,440.间隔,即离散的时间段,乘以数字是另一个离散的时间段,请参阅日期时间和间隔算法的文档.所以,这个操作的结果是一个间隔,让我们:

date + interval - date
Run Code Online (Sandbox Code Playgroud)

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

date - date
Run Code Online (Sandbox Code Playgroud)

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

这是值得一提的是:

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

"技巧"方法失败,但很少会失败.一如既往,最好是正确地做到这一点.