SQL日期转换报错:字符转日期/时间失败问题求助
解决SQL中“Conversion failed when converting date and/or time from character string”错误
这个错误我碰到过很多次,结合你给出的YYYYMMDD格式日期示例和SQL代码,问题大概率出在日期字符串的转换逻辑或者表中存在无效日期值上,给你几个靠谱的解决思路:
1. 用CONVERT()指定格式代码(最稳妥的转换方式)
直接用CAST()转换YYYYMMDD格式的字符串时,SQL Server有时候会因为数据库的区域设置、语言配置等因素识别失败。换成CONVERT()并指定格式代码112(对应ISO标准的YYYYMMDD格式),能明确告诉数据库该如何解析字符串,避免识别偏差:
select 'NLFMF' as Source_code, gPolicy_Number_static, gPolicy_Number, PolicyNumber as Policy_Number, TransactionGroup, TransactionType, Txn_Amount, CONVERT(date, Policy_Txn_Date, 112) as Policy_Txn_Date, CONVERT(date, Policy_Txn_Post_Date, 112) as Policy_Txn_Post_Date from MARTDB.dbo.stg_MFCPremiums_Prepare
2. 排查并处理表中的无效日期值
如果用CONVERT()还是报错,那说明你的表中肯定藏着不符合要求的无效数据——比如长度不是8位的字符串、像20070230(2月没有30号)这种不存在的日期。你可以先把这些问题行查出来:
select * from MARTDB.dbo.stg_MFCPremiums_Prepare where -- 先检查长度是否合规 LEN(Policy_Txn_Date) != 8 OR LEN(Policy_Txn_Post_Date) != 8 -- 再检查能否正常转换为日期 OR TRY_CONVERT(date, Policy_Txn_Date, 112) IS NULL OR TRY_CONVERT(date, Policy_Txn_Post_Date, 112) IS NULL
找到问题行后,你可以选择修正数据,或者用TRY_CONVERT()替代CONVERT(),让查询在遇到无效值时返回NULL而不是直接报错:
select 'NLFMF' as Source_code, gPolicy_Number_static, gPolicy_Number, PolicyNumber as Policy_Number, TransactionGroup, TransactionType, Txn_Amount, TRY_CONVERT(date, Policy_Txn_Date, 112) as Policy_Txn_Date, TRY_CONVERT(date, Policy_Txn_Post_Date, 112) as Policy_Txn_Post_Date from MARTDB.dbo.stg_MFCPremiums_Prepare
补充小提示
- 格式代码
112是SQL Server处理YYYYMMDD格式日期的黄金标准,几乎不会出现识别错误; - 如果你的数据库语言设置是中文或者其他非英语区域,
CAST()的自动识别逻辑容易出问题,这时候CONVERT()指定格式就显得尤为重要。
内容的提问来源于stack exchange,提问作者user2447136
相关产品推荐
相关产品推荐

