时间戳算术的结果是一个 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 )
“trick”版本之所以有效,是因为运算符的优先顺序以及日期和时间戳算术之间的差异。
最初的操作如下所示:
date + ( interval * number ) - date
如文档中所述:
Oracle 先计算括号内的表达式,然后再计算括号外的表达式。
因此,第一个操作将间隔乘以 1,440。一个间隔,即一个离散的时间段,乘以一个数字是另一个离散的时间段,请参阅有关 datetime 和间隔算术的文档。所以,这个操作的结果是一个区间,给我们留下:
date + interval - date
加号运算符在这里优先于减号。原因可能是间隔减去日期是无效操作,但文档也暗示是这种情况(没有出来说)。因此,执行的第一个操作是日期 + 间隔。一个日期加上一个间隔就是一个日期。刚离开
date - date
根据文档,这会产生一个表示天数的整数。但是,您将原始时间间隔乘以 1,440,因此这现在代表了原本天数的 1,440 倍。然后你就剩下秒数了。
值得注意的是:
当间隔计算返回日期时间值时,结果必须是实际的日期时间值,否则数据库会返回错误。例如,接下来的两个语句返回错误:
“技巧”方法会失败,但很少会失败,但它仍然会失败。与以往一样,最好正确地做到这一点。