如何在SSIS中将dd-jun-yyyy hh:mm:ss格式字符串转换为日期格式
解决SSIS中DT-WSTR转TIMESTAMP(带英文月份缩写格式)的问题
这个问题我之前做SSIS项目时也踩过坑,默认的Data Conversion组件确实没法直接解析10-may-2013 10:05:00这种带英文月份缩写的日期格式,给你几个亲测有效的解决思路:
方法1:使用派生列组件(推荐,简单快捷)
SSIS的DATEPARSE函数支持自定义日期格式,完全能处理这种带月份缩写的场景。在派生列组件里新增一个列,表达式写:
DATEPARSE("dd-MMM-yyyy HH:mm:ss", [你的源日期列名])
- 这里的
MMM对应英文月份缩写(不管大小写,DATEPARSE会自动识别) - 如果你的环境默认文化不是英文,保险起见可以先把日期字符串转成统一格式,比如:
DATEPARSE("dd-MMM-yyyy HH:mm:ss", UPPER([你的源日期列名]))
生成的派生列直接设置数据类型为DT_DBTIMESTAMP(对应TIMESTAMP)即可。
方法2:使用脚本组件(灵活性更高)
如果DATEPARSE函数因为环境文化等原因不生效,用脚本组件写代码解析更稳妥,以C#为例:
- 拖入脚本组件,选择“转换”类型,把源日期列作为输入列
- 添加一个输出列,数据类型设为
DT_DBTIMESTAMP,比如命名为ParsedTimestamp - 编辑脚本,在
ProcessInputRow方法里写:
using System; using System.Globalization; public override void Input0_ProcessInputRow(Input0Buffer Row) { // 先判断源列是否为空 if (!Row.YourSourceDate_IsNull && !string.IsNullOrEmpty(Row.YourSourceDate)) { DateTime parsedDate; // 指定解析格式和英文文化信息,避免非英文环境下解析失败 if (DateTime.TryParseExact( Row.YourSourceDate, "dd-MMM-yyyy HH:mm:ss", CultureInfo.GetCultureInfo("en-US"), DateTimeStyles.None, out parsedDate)) { Row.ParsedTimestamp = parsedDate; } else { // 解析失败时标记为空,也可以根据需求抛出错误 Row.ParsedTimestamp_IsNull = true; } } else { Row.ParsedTimestamp_IsNull = true; } }
替换代码里的YourSourceDate为你的实际源列名即可。
注意事项
- 确保日期格式完全匹配:比如你的示例是
dd-MMM-yyyy HH:mm:ss,如果实际数据有其他变体(比如月份缩写是大写MAY),格式字符串不用改,TryParseExact和DATEPARSE都能兼容大小写 - 文化设置:如果SSIS运行在非英文系统上,一定要指定英文文化(比如
en-US),否则月份缩写会解析失败
内容的提问来源于stack exchange,提问作者karDEVproj
相关产品推荐
相关产品推荐

