当前位置: 首页 > 知识库问答 >
问题:

Bigquery iso8601 字符串到时间戳

阎功
2023-03-14

在我的数据集中,我有一个变量< code>duration,其中有200万行< code>ISO 8601格式的数据。示例格式:< code>PT21S或< code>PT5M29S,< code>PT1M16S

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

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

通过该查询,可以区分持续时间是小时、分钟还是秒。我想将字符串持续时间转换为时间。我用过Regex和cast,但没有成功。当我尝试将字符串转换为时间时,我得到了错误:

“无效时间戳:'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”之间不匹配

共有2个答案

督建柏
2023-03-14

也许像这样的事情可以:

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
谢灵均
2023-03-14

下面考虑

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           

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

 类似资料:
  • 问题内容: 我有一个来自json响应的字符串: 如何将此字符串转换为Java DateTime对象? 我尝试使用以下内容: 但与此我只能创建一个日期对象。但是绑定在字符串中的时间还是很重要的。 任何帮助是极大的赞赏! 问题答案: 您可以从Java Date对象创建Joda DateTime对象,因为Java没有类。 尽管Java类也保存时间信息(这是您首先需要的信息),但我还是建议您使用a 代替J

  • 我有以下字符串格式的时间戳 如何将上面的时间戳字符串解析为?

  • 我有一个本地日期时间的字符串表示和一个Java时区。 我正在尝试以 MM/dd/yyyy HH:mm:ssZ 格式获取输出,但我无法弄清楚如何使用正确的日期时间和时区创建日历或 JodaTime 对象。如何将时区转换为可以通过简单日期格式“Z”或“z”解析的值? 和 返回 这是 。 是创建日历或Joda日期时间并通过解析字符串“08/14/2014 15:00:00”来设置各个年/月/日/小时/分

  • 问题内容: 有什么方法可以在MySQL中将字符串转换为UNIX时间戳? 例如,我有一个字符串,需要使用unix时间戳格式。 问题答案: 绝招: 但是,该函数仅采用标准的MySQL格式化日期。如果要使用AM / PM表示法,则需要先使用如下代码:

  • 问题内容: 这是我的问题:我有一个用户输入日期,例如:2012-12-24(字符串)我将一个时间连接到该字符串,然后转换为java.util.Date我的代码如下: 我的问题是,当我使用该util.Date并将其设置为sql.Date时: 它不会给我分配的时间戳,只会以yyyy-MM-dd格式返回日期(例如2012-12-23)。 为什么!?我好沮丧 注意:我注意到当我使用断点时,我能够展开sql

  • 问题内容: 我想将持续时间(即秒数)转换为以冒号分隔的时间字符串(hh:mm:ss) 我在这里找到了一些有用的答案,但他们都谈论转换为x小时和x分钟格式。 那么,有没有一个小片段在jQuery或原始JavaScript中做到这一点? 问题答案: 您现在可以像这样使用它: 工作片段: