2017-05-31 154 views
3

我有一个包含50列的源文件。其中一列为TransDateTime,其中的值为格式22-MAY-2017 02:31:15.00。现在,在将此源文件加载到最终目标表之前,我希望将其转换为格式22-05-2017 02:31:15.00,以便我可以使用该列的数据类型datetime将月份名称更改为SSIS中的月份编号

我已经看到如果该列只包含像下面这样的月份值,将月份名称转换为月份编号的方法。

我不知道如何解决这个场景在我的情况。任何解决方案

+0

您是否使用SSIS加载数据(如示例中所示)?或者你正在寻找通过查询的方式? –

+0

我正在使用ssis数据流任务 –

+0

我会这样做:使用SSIS将源数据推入临时表,raw。然后编写一个查询来解析两条破折号之间的所有日期(可能使用CHARINDEX),并用数字等值替换,然后重新格式化日期。将其作为执行SQL任务运行。最后,将数据从登台表推送到目的地。 –

回答

2

那么一个解决方案是替换。只需将“MAY”替换为“05”,即可从样本输入中获得理想的结果。

在一个表达式中嵌套12 REPLACE函数,您将处理每种可能的情况。

2

使用脚本组件。将输入栏这样你想要的格式在C#

DateTime.Parse("22-MAY-2017 02:31:15.00").ToString("dd-MM-yyyy HH:mm:ss.ff"); 

例如,如果你输入列指明MyDate和Out把列OutPutCol则:

OutPutCol = DateTime.Parse(Row.MyDate).ToString("dd-MM-yyyy HH:mm:ss.ff"); 

你可以check the code here

1

如果您的目标列数据类型为datetime,那么您不打算重新格式化日期字符串。但您正在寻找将此字符串转换为日期值。

您可以在数据流任务中添加Script COmponent,输出列为DT_DBTIMESTAMP,标记为TransDateTime列作为输入。并使用下面的代码:(我用VB.NET)

Public Overrides Sub Input0_ProcessInputRow(ByVal Row As Output0Buffer) 

    Row.OutDate = DateTime.ParseExact(Row.TransDateTime,"dd-MMM-yyyy HH:mm:ss.ff",New System.Globalization.CultureInfo("en-GB")) 

End Sub 

如果你的目标列的类型是字符串,那么你必须按照同样的步骤,但输出列应该是DT_STR类型的,你有使用以下代码:

Public Overrides Sub Input0_ProcessInputRow(ByVal Row As Output0Buffer) 

    Row.OutDate = DateTime.ParseExact(Row.TransDateTime,"dd-MMM-yyyy HH:mm:ss.ff",New System.Globalization.CultureInfo("en-GB")).ToString("dd-MM-yyyy HH:mm:ss.ff") 

End Sub