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

BigQuery中INT64类型LENGTH函数报错及日期格式修正咨询

BigQuery SQL报错解决:INT64日期的长度判断与数值运算

核心问题分析

你遇到的报错是因为LENGTH()函数仅支持STRING或BYTES类型,不能直接用于INT64。下面针对你的两个问题逐一解答:

问题1:g_date保持INT64格式时,如何获取其“长度”(位数)?

可以做到,但不能直接用LENGTH(),有两种可行方案:

  • 方案一:数值范围判断
    8位的yyyymmdd格式INT64数值范围是10000000到99999999,直接用这个范围判断位数,完全不需要转换类型,性能更优:
    CASE 
      WHEN deg.g_date BETWEEN 10000000 AND 99999999 THEN deg.g_date
      ELSE deg.g_date*100 + 1 
    END g_date
    
  • 方案二:临时转字符串判断
    在CASE的条件判断环节,把INT64转成STRING用LENGTH(),但最终返回的结果还是INT64类型,既满足判断需求,又保持字段格式:
    CASE 
      WHEN LENGTH(CAST(deg.g_date AS STRING)) = 8 THEN deg.g_date
      ELSE CAST(deg.g_date AS INT64)*100 + 1 
    END g_date
    

问题2:若g_date非INT64格式,能否执行乘以100加1的操作?

不行,非数值类型(比如STRING)无法直接做算术运算。必须先通过CAST(deg.g_date AS INT64)把它转换成INT64类型,再执行*100+1的计算——这其实就是你原代码里的正确写法,只要g_date的字符串内容是合法的整数(比如yyyymm格式的数字字符串)就能正常运行。

修正后的完整SQL

这里用数值范围判断的版本,效率更高:

SELECT
  deg.MASTER_PERSON_INDEX deg_mpi, deg.G_CIP cip,
  CASE 
    WHEN deg.g_date BETWEEN 10000000 AND 99999999 THEN deg.g_date
    ELSE deg.g_date*100 + 1 
  END g_date,
  deg.g_ipeds ipeds, 
  '0' deg
FROM
  `graduation_di` deg
WHERE deg.MASTER_PERSON_INDEX IS NOT NULL

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 05:55:15