在我的数据集中,我有一个可变的duration
,其中有 200 万行 ISO 8601
格式的数据。格式示例:PT21S
或 PT5M29S
、PT1M16S
我在将此字符串变量转换为时间时遇到问题。目前我正在使用查询:
REGEXP_EXTRACT(duration, r'[^\d]+') as time,
通过此查询,可以区分持续时间是以小时、分钟还是秒为单位。我想将字符串持续时间转换为时间。我已经使用了正则表达式和强制转换,但没有成功。 当我尝试将字符串转换为时间时,出现错误:
"Invalid timestamp: '15S'"
"Invalid timestamp: '1M'
"Bad int64 value: 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
我收到错误:
Mismatch between format character 'S' and string character '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'),
regexp_extract(time_str, r'(\d+)S')
]) val with offset) time_time
from data
如果应用于问题中的示例数据 - 输出为
关于sql - Bigquery iso8601 字符串转时间戳,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66352318/