SSIS日期格式转换报错求助:DD-MMM-YY转YYYY-MM-DD
解决SSIS中DD-MMM-YY转YYYY-MM-DD日期格式问题
方法一:使用CASE语句的派生列表达式(直观可靠)
替换你原来的派生列表达式为以下代码,通过CASE匹配月份缩写直接生成对应数字,避免字符串索引计算出错:
"20" + SUBSTRING([Data Chiusura Deroga], 8, 2) + "-" + CASE SUBSTRING([Data Chiusura Deroga], 4, 3) WHEN "Jan" THEN "01" WHEN "Feb" THEN "02" WHEN "Mar" THEN "03" WHEN "Apr" THEN "04" WHEN "May" THEN "05" WHEN "Jun" THEN "06" WHEN "Jul" THEN "07" WHEN "Aug" THEN "08" WHEN "Sep" THEN "09" WHEN "Oct" THEN "10" WHEN "Nov" THEN "11" WHEN "Dec" THEN "12" END + "-" + SUBSTRING([Data Chiusura Deroga], 1, 2)
注意事项:
- 确认
[Data Chiusura Deroga]列的格式严格为DD-MMM-YY(无多余空格或符号),如果有空格,需要先使用LTRIM(RTRIM([Data Chiusura Deroga]))清理后再截取。
方法二:直接利用SSIS日期类型转换(简洁高效)
如果SSIS包的区域设置支持英文月份缩写(或强制使用不变文化),可以直接将字符串转成日期类型再转成目标格式:
(DT_WSTR, 10)(DT_DBDATE)([Data Chiusura Deroga])
如果区域设置不兼容导致转换失败,可显式拼接年份后转换:
(DT_WSTR, 10)(DT_DBDATE)(SUBSTRING([Data Chiusura Deroga], 1, 6) + "20" + SUBSTRING([Data Chiusura Deroga], 7, 2))
方法三:脚本组件转换(灵活处理复杂场景)
如果上述方法仍有问题,使用C#脚本组件进行转换,兼容性更强:
- 在数据流程中添加脚本组件,选择“转换”类型
- 在脚本编辑器中,将
[Data Chiusura Deroga]添加到输入列,添加一个输出列(如ConvertedDate,类型为字符串) - 在
ProcessInputRow方法中写入以下代码:
public override void Input0_ProcessInputRow(Input0Buffer Row) { string inputDate = Row.DataChiusuraDeroga; DateTime parsedDate; // 按指定格式解析日期,使用InvariantCulture确保识别英文月份 if (DateTime.TryParseExact(inputDate, "dd-MMM-yy", System.Globalization.CultureInfo.InvariantCulture, System.Globalization.DateTimeStyles.None, out parsedDate)) { Row.ConvertedDate = parsedDate.ToString("yyyy-MM-dd"); } else { // 处理转换失败的情况,标记为NULL Row.ConvertedDate_IsNull = true; } }
原代码问题分析
你之前的表达式中月份始终为01,大概率是以下原因:
[Data Chiusura Deroga]列的实际格式与预期的DD-MMM-YY不符(比如存在多余空格,导致SUBSTRING([Data Chiusura Deroga],4,3)截取到的不是正确的月份缩写)- 整数除法的计算逻辑在特定场景下出错(比如FINDSTRING返回的位置不符合预期)
内容的提问来源于stack exchange,提问作者Elsheikh Hifni
相关产品推荐
相关产品推荐

