sql - Bigquery iso8601 字符串转时间戳

标签 sql time google-bigquery iso8601

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

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

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           

如果应用于问题中的示例数据 - 输出为

enter image description here

关于sql - Bigquery iso8601 字符串转时间戳,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66352318/

相关文章:

sql - PSQL - 从 "pg_dump"导入时出错

java - 需要有关 android sql 查询的帮助

ruby-on-rails - time_ago_in_words 和本地化

google-bigquery - 创建列类型为 RECORD 的表

mysql - mysql中如何使用group by和count

C# - 使用变量作为 MySQL 表名

javascript - 在javascript中获取没有时间的日期ISO字符串

php - 获取自 mysql 查询中特定日期以来的小时数

google-bigquery - 在 bigquery 中使用一年中的一周和随后的一周

sql - 时间戳到日期 SQL