SQL调用date_parse转换YYYYMMDD字符串为日期报INVALID_FUNCTION_ARGUMENT错误
问题原因
你遇到的报错来自两个核心问题:
- 解析格式不匹配:你使用的
%Y/%m/%d格式符仅能匹配2021/05/31这类带斜杠分隔的日期字符串,但你的原始数据是20210531这类无分隔符的8位连续字符串,格式完全不对应 - 存在脏数据:报错提示里的
Invalid format: ""说明表中存在值为空字符串的start_date字段,也会触发解析异常
解决方案
根据你的SQL语法(date_parse常见于Presto/Athena类引擎),可以按以下方式修改:
方案1:过滤脏数据后解析
适合不需要保留空值行的场景:
SELECT date_parse(start_date, '%Y%m%d') AS start_date FROM sql_question_five_2 -- 过滤空字符串和长度不符合的脏数据 WHERE start_date != '' AND LENGTH(start_date) = 8;
执行后返回的结果就是标准日期类型,默认展示为YYYY-MM-DD格式。
方案2:兼容脏数据,解析失败返回空值
适合需要保留所有行的场景,用try函数捕获解析异常:
SELECT try(date_parse(start_date, '%Y%m%d')) AS start_date FROM sql_question_five_2;
如果需要输出为YYYY-MM-DD格式的字符串
可以额外加date_format函数处理:
SELECT date_format(try(date_parse(start_date, '%Y%m%d')), '%Y-%m-%d') AS start_date_str FROM sql_question_five_2;
其他SQL方言适配
如果你用的是MySQL,替换为str_to_date函数即可:
-- 兼容脏数据写法 SELECT IF(LENGTH(start_date) = 8, STR_TO_DATE(start_date, '%Y%m%d'), NULL) AS start_date FROM sql_question_five_2;
内容的提问来源于stack exchange,提问作者KatH.
相关产品推荐
相关产品推荐

