You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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,说明两个问题:

  1. 你的Timesent字段格式根本不是月-日-年(比如06-22-2017),而是和第一个例子一样的月/日/年格式,格式符和实际字符串不匹配,自然解析失败;
  2. 也可能Timesent里存在空值、非日期格式的异常内容,SAFE函数遇到无法解析的内容会返回NULL,而不是报错。

排查步骤:

  1. 先确认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))
  1. 清理字符串中的干扰字符:SFMC导出的日期可能带首尾空格,先做清洗:
SAFE.PARSE_DATE('%-m/%-d/%Y', TRIM(Timesent))
  1. 定位异常值:如果还是有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

火山引擎 最新活动