代码之家  ›  专栏  ›  技术社区  ›  cagcowboy

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

  •  1
  • cagcowboy  · 技术社区  · 11 年前

    是否有一种简单/内置的方法来转换Oracle中的ISO 8601持续时间/周期?

    假设我想转身 PT0H4M51S 有没有一种方法可以在不编写自己的解析器/代码的情况下做到这一点?

    谢谢

    1 回复  |  直到 11 年前
        1
  •  2
  •   Alex Poole    9 年前

    正如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() 版本可以使用任何有效格式。