You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

BigQuery中如何解析冒号分隔小数秒字符串为DATETIME/TIMESTAMP

BigQuery冒号分隔小数秒的时间字符串转换方案

待转换的时间字符串为'29-JUN-2022 05:56:31:653000000 AM',由于BigQuery原生时间解析函数仅识别.作为秒与小数秒的分隔符,直接使用PARSE系列函数解析冒号分隔的场景会抛出格式不匹配错误,可通过以下两种方案实现转换:

方案1:定位替换分隔符后解析(性能最优)

BigQuery的REPLACE函数支持指定替换第N次出现的目标字符,原时间字符串中一共存在3个冒号,前两个是时-分、分-秒的常规分隔符,第三个是秒与小数秒的异常分隔符,直接将第三个冒号替换为.即可走标准解析逻辑:

-- 转换为DATETIME类型
SELECT
  PARSE_DATETIME(
    '%d-%b-%Y %I:%M:%E*S %p',
    REPLACE('29-JUN-2022 05:56:31:653000000 AM', ':', '.', 3)
  ) AS res_datetime,
  -- 转换为TIMESTAMP类型,可按需指定时区,默认使用UTC
  PARSE_TIMESTAMP(
    '%d-%b-%Y %I:%M:%E*S %p',
    REPLACE('29-JUN-2022 05:56:31:653000000 AM', ':', '.', 3),
    'UTC'
  ) AS res_timestamp

解析结果:

  • res_datetime:2022-06-29T05:56:31.653000
  • res_timestamp:2022-06-29 05:56:31.653000+00

方案2:正则匹配替换分隔符(兼容性更强)

如果待处理的时间字符串长度不固定、无法通过固定替换次数定位分隔符,可使用正则精准匹配秒位后的冒号做替换,适配更多格式变体:

SELECT
  PARSE_DATETIME(
    '%d-%b-%Y %I:%M:%E*S %p',
    REGEXP_REPLACE(
      '29-JUN-2022 05:56:31:653000000 AM',
      r'(\d{1,2}):(\d{6,9})( [AP]M)$',
      r'\1.\2\3'
    )
  ) AS res_datetime

解析说明

  • 格式符中%d匹配两位日期、%b匹配三位缩写月份、%Y匹配四位年份、%I匹配12小时制小时、%M匹配分钟、%E*S自动适配带小数的秒值、%p匹配AM/PM标识,注意不要误用24小时制的%H格式符,否则会因AM/PM标识无法匹配报错。
  • 原字符串的9位小数秒为纳秒精度,BigQuery时间类型最高支持微秒级精度,解析时会自动截断超出精度的部分,不影响结果准确性。

内容的提问来源于stack exchange,提问作者Sharath Abhyankar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 07:01:02