我有两个 timestamp
栏目:arrTime
和 depTime
.
我需要找出公共(public)汽车晚点的分钟数。
我尝试了以下方法:
SELECT RouteDate, round((arrTime-depTime)*1440,2) time_difference
FROM ...
我收到以下错误:
inconsistent datatype . expected number but got interval day to second
我如何解析分钟数?
如果我简单地减去:
SELECT RouteDate, arrTime-depTime)*1440 time_difference
结果正确但格式不正确: time_difference
+00000000 00:01:00 0000000
最佳答案
时间戳算术的结果是一个 INTERVAL 数据类型。您有一个 INTERVAL DAY TO SECOND那里...
如果您想要分钟数,一种方法是使用 EXTRACT()
, 例如:
select extract( minute from interval_difference )
+ 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 )
“trick”版本之所以有效,是因为 operator order of precedence以及日期和时间戳算术之间的差异。最初的操作如下所示:
date + ( interval * number ) - date
如文档中所述:Oracle evaluates expressions inside parentheses before evaluating those outside.
因此,第一个操作将间隔乘以 1,440。一个区间,即一个离散的时间段,乘以一个数字是另一个离散的时间段,see the documentation on datetime and interval arithmetic .所以,这个操作的结果是一个区间,给我们留下:
date + interval - date
加号运算符在这里优先于减号。原因可能是间隔减去日期是无效操作,但文档也暗示是这种情况(没有出来说)。因此,执行的第一个操作是日期 + 间隔。一个日期加上一个间隔就是一个日期。刚离开date - date
根据文档,这会产生一个表示天数的整数。但是,您将原始时间间隔乘以 1,440,因此这现在代表了原本天数的 1,440 倍。然后你就剩下秒数了。它是 worth noting that :
When interval calculations return a datetime value, the result must be an actual datetime value or the database returns an error. For example, the next two statements return errors:
“技巧”方法会失败,但很少会失败,但它仍然会失败。与以往一样,最好正确地做到这一点。
关于oracle - 如何在 Oracle 中找到不同的 b/w TIMESTAMP 格式值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17413096/