如何在SSIS中将CYYMMDD格式日期转换为YYYY-MM-DD格式?
SSIS 中 CYYMMDD 格式转 YYYY-MM-DD 实现方案
首先明确通用格式规则:CYYMMDD 中的首位 C 为世纪标识,常规规则为 C=0 对应 1900-1999 年,C=1 对应 2000-2099 年,以下方案均基于该规则实现。
方法一:使用派生列转换(无代码,配置即可)
适合逻辑简单、不需要额外异常校验的场景:
- 在数据流任务中添加派生列转换组件,和上游数据源连通
- 新增派生列,使用如下表达式(如果你的CYYMMDD字段是数值类型,需要先转为字符串后再截取):
(DT_DATE)((SUBSTRING((DT_STR,7,1252)[你的CYYMMDD字段名],1,1) == "1" ? "20" : "19") + SUBSTRING((DT_STR,7,1252)[你的CYYMMDD字段名],2,2) + "-" + SUBSTRING((DT_STR,7,1252)[你的CYYMMDD字段名],4,2) + "-" + SUBSTRING((DT_STR,7,1252)[你的CYYMMDD字段名],6,2)) - 如果需要输出字符串格式的 YYYY-MM-DD,去掉表达式外层的
(DT_DATE)转换即可。
方法二:使用脚本组件转换
适合有特殊世纪规则、需要做异常日期校验的场景:
- 在数据流任务中添加脚本组件,类型选择「转换」,连通上游数据源
- 双击打开组件编辑器,在「输入列」选项卡勾选需要转换的CYYMMDD字段,使用类型设为只读
- 切换到「输入和输出」选项卡,新增输出列,命名为
FormattedDate,根据需要选择日期类型或者字符串类型 - 点击「编辑脚本」,在
Input0_ProcessInputRow方法中写入以下逻辑:
public override void Input0_ProcessInputRow(Input0Buffer Row) { // 替换为你实际的字段名 string rawDate = Row.CYYMMDDField.Trim(); if (rawDate.Length == 7) { string yearPrefix = rawDate[0] == '1' ? "20" : "19"; string dateStr = $"{yearPrefix}{rawDate.Substring(1,2)}-{rawDate.Substring(3,2)}-{rawDate.Substring(5,2)}"; if (DateTime.TryParse(dateStr, out DateTime res)) { // 输出日期类型用这个 Row.FormattedDate = res; // 输出字符串类型把上面一行替换为:Row.FormattedDate = dateStr; } else { // 非法日期赋值为NULL Row.FormattedDate_IsNull = true; } } else { Row.FormattedDate_IsNull = true; } }
注意事项
- 转换完成后可以在派生列/脚本组件的下游添加数据查看器,快速校验转换结果是否符合预期
- 如果你的世纪规则和通用规则不同,调整表达式或者脚本里的前缀判断逻辑即可
内容的提问来源于stack exchange,提问作者Ajitha
相关产品推荐
相关产品推荐

