正如Leo在评论中提到的,您可以使用
the
to_dsinterval()
function
,它接受ISO格式(最多天;月和年可以由
to_yminterval()
相反);但这给了你一个
INTERVAL DAY TO SECOND
data type
:
select to_dsinterval('PT0H4M51S')
from dual;
DURATION
-----------
0 0:4:51.0
你可以用
the
extract
function
:
with t as (
select to_dsinterval('PT0H4M51S') as duration
from dual
)
select (extract (day from duration) * 86400)
+ (extract (hour from duration) * 3600)
+ (extract (minute from duration) * 60)
+ extract (second from duration) as seconds
from t;
SECONDS
----------
291
如果你只有一段时间,所以不能超过一天,那么你可以使用日期操作:
select (to_date('PT0H4M51S', '"PT"HH24"H"MI"M"SS"S"')
- trunc(sysdate, 'MM')) * 86400 as seconds
from dual;
SECONDS
----------
291
如果将仅包含时间的字符串转换为
DATE
在Oracle中键入,默认为当月的第一天。和
trunc(sysdate, 'MM')
给你当月的第一天午夜。差值是以一天的分数表示的持续时间,因此乘以60*60*24得到以秒为单位的差值。
但是你必须提供固定的文本部分(P、T、H、M和S)作为引用的文字,所以你必须确切地知道你要接收的格式。这个
to_dsinterval()
版本可以使用任何有效格式。