to_date函数日期格式错误排查请求——附关联查询SQL语句
解决to_date函数的日期格式匹配错误
嘿,我一眼就发现问题所在了——你的to_date函数里的格式掩码和实际截取的字符串完全不匹配,这才导致了格式错误!
错误原因分析
你用substr("SCC_STG_DIM_OVERWRITE_FNL"."TERM_END_DT", 1, 19)截取了字段的前19位,这部分内容的格式应该是yyyy.mm.dd hh24:mi:ss(比如2024.05.20 14:30:45),但你给to_date的格式掩码却写了'yyyy.mm.dd hh24:mi:ss.aaaaaaaaa',多出来的.aaaaaaaaa部分在截取后的字符串里根本不存在,数据库自然无法解析这个格式。
修正后的查询
把格式掩码改成和截取内容完全匹配的版本就行:
SELECT to_date(substr("SCC_STG_DIM_OVERWRITE_FNL"."TERM_END_DT", 1, 19), 'yyyy.mm.dd hh24:mi:ss') FROM ("EDMWHS"."SERVICE_CONTRACT" "SERVICE_CONTRACT" INNER JOIN "EDMSTG"."STG_SERVICE_CONTR_DELTA" "STG_SERVICE_CONTR_DELTA" ON ("STG_SERVICE_CONTR_DELTA"."CRM_ORDER_OBJECT_GUID" = "SERVICE_CONTRACT"."CRM_ORDER_OBJECT_GUID")) INNER JOIN "EDMSTG"."SCC_STG_DIM_OVERWRITE_FNL" "SCC_STG_DIM_OVERWRITE_FNL" ON ("SCC_STG_DIM_OVERWRITE_FNL"."CRM_ORDER_OBJECT_GUID" = ...) -- 补全你的连接条件
额外优化提示
如果TERM_END_DT本身就是日期类型或者时间戳类型,其实完全不需要用substr和to_date来转换,直接使用字段本身即可,这样既能避免格式错误,又能提升查询效率。
内容的提问来源于stack exchange,提问作者Pratik Fouzdar




