BigQuery字符串转日期失败,SAFE.PARSE_DATE返回NULL问题求助
解决SFMC导入日期字符串的解析问题
我来帮你梳理下排查思路和解决方案,从你的两次尝试结果来看,核心问题大概率是日期格式符和实际字符串不匹配,或者SFMC导出的日期有你没注意到的细节,咱们一步步来:
先看第一个尝试的问题
你用 PARSE_DATE('%m/%d/%Y', '6/22/2017') 返回了"invalid date",这是因为格式符 %m 要求是两位数的月份(比如06),但你的输入是单数字的6。BigQuery里要解析不带前导零的月/日,得用 %-m 和 %-d 格式符,所以正确的写法应该是:
PARSE_DATE('%-m/%-d/%Y', '6/22/2017')
这样单数字的月份就能被正常解析了。
再看第二个尝试的NULL结果
你用 SAFE.PARSE_DATE('%m-%d-%Y', Timesent) 返回NULL,说明两个问题:
- 你的
Timesent字段格式根本不是月-日-年(比如06-22-2017),而是和第一个例子一样的月/日/年格式,格式符和实际字符串不匹配,自然解析失败; - 也可能
Timesent里存在空值、非日期格式的异常内容,SAFE函数遇到无法解析的内容会返回NULL,而不是报错。
排查步骤:
- 先确认
Timesent的真实格式:跑个简单的查询看看样本值:
SELECT DISTINCT Timesent FROM your_table LIMIT 20;
如果发现日期带时间(比如6/22/2017 15:45:30),那就要用PARSE_DATETIME来解析,再转成DATE类型:
DATE(PARSE_DATETIME('%-m/%-d/%Y %H:%M:%S', Timesent))
- 清理字符串中的干扰字符:SFMC导出的日期可能带首尾空格,先做清洗:
SAFE.PARSE_DATE('%-m/%-d/%Y', TRIM(Timesent))
- 定位异常值:如果还是有NULL,筛选出这些异常值看看是什么情况:
SELECT Timesent FROM your_table WHERE SAFE.PARSE_DATE('%-m/%-d/%Y', TRIM(Timesent)) IS NULL;
这样就能看到哪些日期字符串无法解析,针对性调整格式符或者处理异常数据。
通用注意点
- BigQuery的日期格式符区分带前导零和不带前导零:
%m是两位数月份,%-m是单/双数均可;%d和%-d同理; - 如果SFMC导出的是带时区的日期,需要用
PARSE_TIMESTAMP,再转换为DATE; - 优先用
SAFE.前缀的函数,避免单个异常值导致整个查询失败。
内容的提问来源于stack exchange,提问作者RandyW




