4

我有两timestamp列:arrTimedepTime。我需要找出公共汽车晚点的分钟数。我尝试了以下方法:

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
4

3 回答 3

13

时间戳算术的结果是一个 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 倍。然后你就剩下秒数了。

值得注意的

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

“技巧”方法失败,但很少会失败,但它仍然会失败。与以往一样,最好正确地做到这一点。

于 2013-07-01T21:14:45.350 回答
1
SELECT (arrTime - depTime) * 1440 time_difference
  FROM Schedule
 WHERE ...

这将为您提供以分钟为单位的时差。当然,你可以做任何你可能需要得到整分钟的四舍五入....

于 2013-07-01T20:36:50.010 回答
1

转换为DATEfirst 以数字形式返回差异,至少在我尝试过的 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中的秒。它们一起给出了以秒为单位的绝对时间。

于 2013-08-16T19:24:25.540 回答