字符转日期/时间失败:同方法同数据格式在其他表可正常运行
日期转换错误的原因分析与替代方案
可能的报错原因
- 隐性转换与隐藏无效字符:如果新表的
src_create_dt是varchar类型,可能存在肉眼难以发现的无效字符(比如前后空格、全角数字、换行/回车控制符),转成varchar后这些字符会保留,导致convert(date, ..., 112)解析失败。哪怕看起来是标准的YYYYMMDD格式,这些隐藏字符都会破坏转换逻辑。 - 原数据类型导致的转换偏差:如果
src_create_dt是datetime/datetime2类型,直接转varchar时会使用数据库默认的日期格式(而非112),生成的字符串格式不符合YYYYMMDD,再用112格式解析自然报错。而之前的表可能原列是数值类型(int/bigint),转varchar后刚好是纯数字的YYYYMMDD格式,所以能正常转换。 - 无效日期值:date类型的有效范围是1753-01-01到9999-12-31,如果数据中存在
00000000、99991301这类格式正确但实际不存在的日期,转换也会失败。
可行的转换方案
方案1:针对数值类型列的直接转换
如果src_create_dt是int/bigint类型,跳过多余的varchar转换,直接转成char后再转date:
CONVERT(date, CAST(DDC.src_create_dt AS CHAR(8)), 112) AS 'Created Date'
方案2:清理字符串列的隐藏无效字符
如果是varchar类型列,先清理空格和控制字符再转换:
CONVERT(date, LTRIM(RTRIM(REPLACE(REPLACE(DDC.src_create_dt, CHAR(10), ''), CHAR(13), ''))), 112) AS 'Created Date'
方案3:用TRY_CONVERT容错并排查无效数据
如果不确定数据中是否存在无效值,用TRY_CONVERT替代CONVERT,转换失败时返回NULL,同时可以快速定位问题数据:
TRY_CONVERT(date, CAST(DDC.src_create_dt AS CHAR(8)), 112) AS 'Created Date'
排查无效数据的语句:
SELECT src_create_dt FROM DDC WHERE TRY_CONVERT(date, CAST(src_create_dt AS CHAR(8)), 112) IS NULL
方案4:针对datetime类型列的简化转换
如果src_create_dt本身是datetime/datetime2类型,直接转date即可,不需要多余的转换步骤:
CAST(DDC.src_create_dt AS date) AS 'Created Date'
内容的提问来源于stack exchange,提问作者Boris
相关产品推荐
相关产品推荐

