我有两个timestamp
列:arrTime
和depTime
。
我需要找到公共汽车迟到的人数。
我尝试了以下方法:
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
答案 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倍。然后你会得到秒数。
当间隔计算返回日期时间值时,结果必须是实际的日期时间值,否则数据库将返回错误。例如,接下来的两个语句返回错误:
“技巧”方法将失败,但很少会失败。一如既往,最好这样做。
答案 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
是白天。他们一起在几秒钟内给出绝对时间。