2016-07-05 104 views
0

我需要使用.Net将日期字段以varchar格式(DDMMYYYY)转换为DateTime。我尝试了许多解决方案,但都徒劳无功。我的来源是一个平面文件,我的目标是一张桌子。我在SSIS包中使用脚本。使用VB脚本将varchar转换为datetime

下面是示例:

列SampleDate处于ddmmyyyy格式。我将它转换为MM/dd/YYYY以便将其转换为日期时间格式。

Dim retString1 As String 
Dim slash As Char = ChrW(&H2F) 
retString1 = Row.SampleDate.Substring(2, 2) & "/" 
Dim retString2 As String 
retString2 = Row.SampleDate.Substring(0, 2) & "/" 
Dim retString3 As String 
retString3 = Row.SampleDate.Substring(4, 4) 
Dim retString4 As String 
retString4 = retString1 & retString2 & retString3 

Dim fromDt As Date = Convert.ToDateTime(retString4) 
fromDt = Row.SampleDate 

P.S. :我没有在评论之前查找转换的SQL Query,请详细阅读整个问题。我正在寻找一个VB代码而不是SQL代码。

+0

你应该真的检查答案还没有提供之前提出一个新的问题:http://stackoverflow.com/questions/21833719/convert-flatfile-column-to-datetime – BIDeveloper

+0

亲爱的BIDeveloper,如果你认为答案已经在那里,让我知道。相信我我已经尝试了一切,但我的VB代码不是将DDMMYYYY转换为YYYY-MM-DD HH:MM:SS格式。 –

+0

虽然我不怀疑如何将字符串(从平面/文本文件)转换为(子)类型Date的变量的问题之前已被问到,答案“使用从您的SQL Server转换”是错误的。 –

回答

1

只需掀开fromdt = Row.SampleDate

Row.SampleDate = fromdt 

你的脚本应该可以工作,但如果你想要的话,请看下面的内容。

HOW TO DO IT没有剧本--see下面的脚本方法

你可以,如果你使用Derived Column转型,而不是让这个简单了很多自己!数据转换转换不起作用,因为它不允许您操纵列的值,而只能处理数据类型。但是在派生列中,您可以剪切字符串并将结果作为日期进行投射。

因此,在您的数据流中源到派生列到目的地。

enter image description here

在派生列的添加新的列,并使用下列作为表达式

然后使用此作为Expression(用含有ddMMyyyy格式的日期name of your column替换DateString):

(DT_DATE)(SUBSTRING(DateString,3,2) + "/" + (LEFT(DateString,2) + "/" + RIGHT(DateString,4))) 

(dt_date)可以切换为另一种日期格式,如果您愿意并且该类型转换将自动执行a在Derived Column上设置Data Type。然后在您的destinationnew derived column映射到destination column而不是您的source的原始列。

enter image description here

就是这样做的,没有剧本。

HOW TO DO IT通过脚本

为了解决途径,如果你想留一个脚本,也许注入一些额外的逻辑,而不是简单的转换就可以通过在一个transformationscript component做你data flow task。它将取代上述的derived column转换,但基本上只能通过脚本完成相同的操作。我在这里采取措施,我猜你已经知道一些在别人绊倒在帖子上的情况。

  • 添加脚本组件一旦你选择了“转型”,并与您连接源
  • 打开脚本组件,然后转到“Inputs and Outputs”部分,并添加一个输出持有新列,并设置数据类型。一个新列是必要的,因为你正在改变数据类型

enter image description here

  • 去 “Input Columns” 部分,选择SampleDate

enter image description here

  • 回去“Script”部分并选择Vi作为脚本语言的基础。
  • 点击Edit Script开始编码。
  • 向下滚动直到找到sub Input0_ProcessInputRow(ByVal Row...这是您将放置代码的位置。

此代码:

Public Overrides Sub Input0_ProcessInputRow(ByVal Row As Input0Buffer) 

    If Not Row.SampleDate_IsNull Then 

     Row.DerivedDate = DateTime.ParseExact(Row.SampleDate, "ddMMyyyy", System.Globalization.CultureInfo.InvariantCulture) 

    End If 
End Sub 

由于@Shiva的意见建议,你可以扩大这一点,并使用TryParseExact或在try catch块包起来,这样,如果解析日期失败,只会清晰/从记录中删除值并导入将继续。由于处理无效数据更多地是业务需求的问题,所以我会将其留给您。

+0

'这是你完成的,没有脚本。你当然可以通过脚本来完成,但我不明白为什么当标准选项可用于你的'。您的解决方案只能采用“快乐之路”。源日期字段的类型是'varchar'。这意味着它也可能有无效的数据。使用脚本提供了更大的控制,因为您可以在该字段上执行'TryParse'并仅在成功时转换为日期。即使存在有效的日期,这种派生列方法也会失败,这不完全是'DDMMYYYY'格式。这就是说,我为你的努力给了+1。 – Shiva

+1

@Shiva OP明确表示1格式,并没有提到潜在的有效性问题。我完全可以看到使用脚本任务来测试合法性的原因。但问题是如果无效你想要做什么,仍然导入?那导致无效日期的价值应该是什么?如果目标不允许空值,那么导入仍然会失败.....在某些情况下,需要做出数据有效性的决定,通常我会希望它们失败,直到找到模式/发现纠正方法无效的日期而不是悄悄地成功。 PS我使用方式更复杂的脚本 – Matt

+0

感谢澄清。现在有道理。 – Shiva

0

将字符串转换为日期在VBScript中你要么使用CDate() 其执行转换为你,而是取决于当前区域设置或DateSerial()

>> s = "13041953" 
>> d = DateSerial(CInt(Right(s,4)), CInt(Mid(s,3,2)), CInt(Left(s,2))) 
>> WScript.Echo s, TypeName(d), d 
>> 
13041953 Date 13.04.1953 (german locale)