如何在Oracle中轻松解析ISO 8601持续时间/期限?

时间:2014-08-04 11:48:20

标签: oracle iso8601

是否有一种简单/内置的方式可以在Oracle中转换ISO 8601持续时间/句点?

所以,假设我想将PT0H4M51S转换为秒数 - 有没有办法在不编写自己的解析器/代码的情况下执行此操作?

谢谢!

1 个答案:

答案 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()版本适用于任何有效格式。