在BigQuery中转换字符串为无时区且保留3位毫秒的Timestamp
解决方案:字符串时间转Timestamp并保留原格式显示
一、存储层面:准确转换为Timestamp类型
BigQuery中的TIMESTAMP类型默认基于UTC时区,针对你带3位毫秒的无时区字符串时间,推荐用PARSE_TIMESTAMP自定义格式解析,避免自动补全毫秒或添加冗余信息:
SELECT createddate, PARSE_TIMESTAMP("%Y-%m-%d %H:%M:%E3S", createddate) AS converted_timestamp FROM `hd-dev.mm.jira_backlog`
这里%E3S专门匹配3位毫秒格式,能精准对应原字符串的时间结构。
如果要将转换后的数据写入新的TIMESTAMP列,执行以下操作:
-- 新增TIMESTAMP类型列 ALTER TABLE `hd-dev.mm.jira_backlog` ADD COLUMN created_timestamp TIMESTAMP; -- 批量更新数据 UPDATE `hd-dev.mm.jira_backlog` SET created_timestamp = PARSE_TIMESTAMP("%Y-%m-%d %H:%M:%E3S", createddate) WHERE createddate IS NOT NULL;
二、查询显示层面:格式化Timestamp为原字符串样式
如果只是查询时需要输出和原字符串一致的格式(无T分隔符、无时区、保留3位毫秒),用FORMAT_TIMESTAMP函数格式化结果即可:
SELECT createddate, FORMAT_TIMESTAMP("%Y-%m-%d %H:%M:%E3S", PARSE_TIMESTAMP("%Y-%m-%d %H:%M:%E3S", createddate)) AS formatted_timestamp FROM `hd-dev.mm.jira_backlog`
输出结果会完全匹配原字符串的样式,同时底层存储的是标准TIMESTAMP类型。
补充说明
TIMESTAMP()和DATETIME()函数会产生冗余格式,是因为它们默认使用BigQuery标准解析规则,自动补全毫秒到6位、添加时区或T分隔符;而PARSE_TIMESTAMP支持自定义格式,更适配你的场景。- 若原字符串是基于特定时区(如北京时间),转换时可指定时区参数:
PARSE_TIMESTAMP("%Y-%m-%d %H:%M:%E3S", createddate, "Asia/Shanghai")
内容的提问来源于stack exchange,提问作者gcpdev-guy
相关产品推荐
相关产品推荐

