Bigquery iso8601 字符串到时间戳

问题描述

在我的数据集中,我有一个变量 duration,其中有 ISO 8601 格式的 200 万行数据。示例格式:PT21SPT5M29SPT1M16S

我在将此字符串变量转换为时间时遇到问题。目前我正在使用查询

REGEXP_EXTRACT(duration,r'[^\d]+') as time,

通过这个查询,可以区分持续时间是小时分钟还是秒。我想将字符串持续时间转换为时间。我使用了正则表达式和演员,但没有成功。 当我尝试将字符串转换为时间时,出现错误

“无效的时间戳:'15S'”

"无效的时间戳:'1M'

错误的 int64 值:PT11M16S”

我遇到的最大问题是字符串永远不会相同。

更多字符串示例:

PT48S
PT43M40S 
PT7M54S 
PT3M14S 
PT4H17M16S 
PT3M46S 
PT3H18M35S 
PT3H8M45S

更新: 我试过了

WITH data AS (
  SELECT (duration) as time_str FROM x
)
SELECT 
  CASE
    WHEN time_str LIKE 'PT%H%M%s' THEN PARSE_TIME('PT%HH%MM%sS',time_str)
    WHEN time_str LIKE 'PT%M%s' THEN PARSE_TIME('PT%MM%sS',time_str)
    WHEN time_str LIKE 'PT%s' THEN PARSE_TIME('PT%sS',time_str)
    ELSE NULL
  END
FROM data

我收到错误

格式字符“S”和字符串字符“H”不匹配

解决方法

考虑以下

select time_str,( select parse_time('%H:%M:%S',string_agg(ifnull(lpad(val,2,'0'),'00'),':' order by offset))
    from unnest([
      regexp_extract(time_str,r'(\d+)H'),regexp_extract(time_str,r'(\d+)M'),r'(\d+)S')
    ]) val with offset) time_time
from data           

如果应用于您问题中的样本数据 - 输出为

enter image description here

,

也许这样就可以了:

WITH data AS (
  SELECT * FROM UNNEST(['PT48S','PT43M40S','PT7M54S','PT3M14S','PT4H17M16S','PT3M46S','PT3H18M35S','PT3H8M45S']) as time_str
)
SELECT 
  CASE
    WHEN time_str LIKE 'PT%H%M%S' THEN PARSE_TIME('PT%HH%MM%SS',time_str)
    WHEN time_str LIKE 'PT%M%S' THEN PARSE_TIME('PT%MM%SS',time_str)
    WHEN time_str LIKE 'PT%S' THEN PARSE_TIME('PT%SS',time_str)
    ELSE NULL
  END
FROM data

enter image description here