BigQuery使用TIMESTAMP_SECONDS处理JSON提取值时出现签名不匹配错误
解决JSON秒级时间转日期的报错问题
问题原因
TIMESTAMP_SECONDS()函数要求输入数值类型的时间戳,但JSON_EXTRACT_SCALAR提取出的秒数是字符串格式(例如'1646985600'),类型不匹配导致了函数签名错误或"无效时间戳"的提示。
解决方案
先把字符串格式的秒数转换成整数类型,再进行时间戳和日期的转换。推荐用SAFE_CAST处理,避免个别非法值导致整个查询失败。
修改后的查询语句:
SELECT DATE(TIMESTAMP_SECONDS(SAFE_CAST(JSON_EXTRACT_SCALAR(data, '$.fechaCierre._seconds') AS INT64))) AS fechaCierre FROM db LIMIT 10
额外说明
- 简化JSON提取:不需要嵌套
JSON_EXTRACT和JSON_EXTRACT_SCALAR,直接用完整路径$.fechaCierre._seconds就能提取到目标值。 - 安全转换:如果能保证所有秒数字符串都是合法整数,可以用
CAST( ... AS INT64)代替SAFE_CAST,但SAFE_CAST会把转换失败的行返回NULL,不会中断整个查询,容错性更强。 - 分步验证:可以拆分步骤查看每一步的结果,方便排查问题:
SELECT JSON_EXTRACT_SCALAR(data, '$.fechaCierre._seconds') AS 字符串秒数, SAFE_CAST(JSON_EXTRACT_SCALAR(data, '$.fechaCierre._seconds') AS INT64) AS 数值秒数, TIMESTAMP_SECONDS(SAFE_CAST(JSON_EXTRACT_SCALAR(data, '$.fechaCierre._seconds') AS INT64)) AS 时间戳, DATE(TIMESTAMP_SECONDS(SAFE_CAST(JSON_EXTRACT_SCALAR(data, '$.fechaCierre._seconds') AS INT64))) AS fechaCierre FROM db LIMIT 10
内容的提问来源于stack exchange,提问作者Elha
相关产品推荐
相关产品推荐

