是否有一种简单/内置的方式可以在Oracle中转换ISO 8601持续时间/句点?
所以,假设我想将PT0H4M51S
转换为秒数 - 有没有办法在不编写自己的解析器/代码的情况下执行此操作?
谢谢!
答案 0 :(得分:2)
正如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
如果在Oracle中将只包含时间的字符串转换为DATE
类型,则默认为当前月份的第一天。并且trunc(sysdate, 'MM')
会在当月的第一天给你午夜。差异是一天中的分数的持续时间,因此乘以60 * 60 * 24以获得秒的差异。
但是你必须提供固定文本部分(P,T,H,M和S)作为引用的文字,因此你必须确切地知道你将要接收的格式。 to_dsinterval()
版本适用于任何有效格式。