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

在BigQuery中提取字符串:从Body字段提取18位日期序列

问题描述

我的BigQuery xyz表中有一个Body字段,存储着内部应用的扫描请求记录,示例数据如下:

Body
/tpt/TpScaning-ScaningRoad-PERSIVEE-202301020730327429-1567651.tp
/tpt/TpScaning-BaliResortsInterns-PERSIVEE-202205300341154744-909890.tp
/tpt/TpScaning-RXX-PERSIVEE-202108210412090110-000989.tp
/tpt/TpScaning-Backnationnotecom-PERSIVEE-202112201229124214-783672.tp
/tpt/TpScaning-DBZ-PERSIVEE-202109131129036172-908954.tp
/tpt/TpScaning-DBZ-PERSIVEE-202109131129036172-17892578.tp

该字段包含一段18位数字的日期序列(如202301020730327429、202205300341154744等),我希望把这段序列提取到名为date的独立列中,以此获取扫描请求的创建时间。

我试过用substr函数,但因为Body字段长度不固定,没法正确提取,请问有没有更合适的实现方法?

预期输出:

date
202301020730327429
202205300341154744
202108210412090110
202112201229124214
202109131129036172
202109131129036172
解决方案

针对这种固定格式的18位数字提取,推荐使用BigQuery的正则表达式函数REGEXP_EXTRACT,它可以精准匹配目标内容,不受字段长度变化影响。

基础实现SQL

SELECT
  REGEXP_EXTRACT(Body, r'(\d{18})') AS date
FROM
  `your-project.xyz`

精准匹配版(适配示例格式)

如果你的Body字段中,目标18位数字始终被-包裹(如示例中位于PERSIVEE-和-数字.tp之间),可以用更精确的正则避免误匹配:

SELECT
  REGEXP_EXTRACT(Body, r'-(\d{18})-') AS date
FROM
  `your-project.xyz`

说明

  • REGEXP_EXTRACT会从Body字段中提取第一个符合正则规则的内容
  • 正则r'(\d{18})'表示匹配连续18位数字,直接定位目标序列
  • 精准版正则r'-(\d{18})-'限定了数字的前后分隔符,进一步提升匹配准确性

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 22:35:37