SSIS中如何将yyyymmdd格式日期转换为yyyy-mm-dd并导入SQL表
SSIS中yyyymmdd格式日期转换为DATE类型的解决方案
一、修正表达式语法并处理空值/空白
你的原始表达式存在两个关键问题:
- 语法错误:
SUBSTRING([DATE_Column1,4)缺少闭合括号,且列名前后不统一(前面写DATE_Column1,后面是DATE_Column) - 未处理空值/空白列,直接转换会触发报错
正确的派生列表达式需先判断空值/空白,再执行格式转换:
ISNULL([DATE_Column]) || TRIM([DATE_Column]) == "" ? NULL(DT_DATE) : (DT_DATE)(SUBSTRING([DATE_Column],1,4) + "-" + SUBSTRING([DATE_Column],5,2) + "-" + SUBSTRING([DATE_Column],7,2))
- 用
TRIM([DATE_Column]) == ""处理空白值,ISNULL([DATE_Column])处理空值,符合条件时返回NULL(DT_DATE)(匹配目标表的DATE类型) - 非空值时,通过
SUBSTRING拆分年份(前4位)、月份(第5-6位)、日期(第7-8位),拼接为yyyy-MM-dd格式后转换为DT_DATE类型
二、增强合法性校验(可选)
如果源数据存在长度不符合8位的情况(比如7位、9位),会导致SUBSTRING取数错误,可在表达式中增加长度校验:
ISNULL([DATE_Column]) || TRIM([DATE_Column]) == "" || LEN([DATE_Column]) != 8 ? NULL(DT_DATE) : (DT_DATE)(SUBSTRING([DATE_Column],1,4) + "-" + SUBSTRING([DATE_Column],5,2) + "-" + SUBSTRING([DATE_Column],7,2))
三、更可靠的无字符串拼接转换方法
避免字符串拼接可能带来的格式问题,可使用DATEADD函数直接计算日期,性能更稳定:
ISNULL([DATE_Column]) || TRIM([DATE_Column]) == "" || LEN([DATE_Column]) != 8 ? NULL(DT_DATE) : DATEADD("day", (DT_I4)SUBSTRING([DATE_Column],7,2)-1, DATEADD("month", (DT_I4)SUBSTRING([DATE_Column],5,2)-1, DATEADD("year", (DT_I4)SUBSTRING([DATE_Column],1,4)-1900, (DT_DATE)"1900-01-01")))
原理:以1900-01-01为基准,依次加上年份差、月份差、日期差(减1是因为DATEADD是从基准日往后累加N天/月/年)
四、错误行处理
如果存在非法日期(比如20230230),即使格式正确也会转换失败,可在派生列组件的错误输出中设置将失败行重定向到错误表,避免整个包中断,后续单独处理这些异常数据。
内容的提问来源于stack exchange,提问作者Dont_know
相关产品推荐
相关产品推荐

