我需要使用.Net将varchar格式为(DDMMYYYY)
的日期字段转换为DateTime。我尝试了许多解决方案,但都是徒劳的。该字段的源是一个平面文件,我的目标是一个表。我在SSIS包中使用该脚本。
以下是样本:
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查询,所以在评论之前,请仔细阅读整个问题。我正在寻找VB代码,而不是SQL代码。
答案 0 :(得分:1)
只需翻转fromdt = Row.SampleDate
到
Row.SampleDate = fromdt
你的脚本应该可以工作,但如果你愿意,可以参考下面的内容来简化一些。
如何在没有脚本的情况下进行操作 - 请参阅下面的脚本方法
如果您使用Derived Column
转换,您可以让自己变得更加简单!数据转换转换不起作用,因为它不允许您操纵列的值,而只是操作数据类型。但是在派生列中,您可以剪切字符串并将结果转换为日期。
因此,您的数据流中的派生列到目的地的来源。
在派生列中添加新列并使用以下内容作为表达式(将DateString
替换为包含name of your column
格式的日期的ddMMyyyy
)
然后将其用作Expression
:
(DT_DATE)(SUBSTRING(DateString,3,2) + "/" + (LEFT(DateString,2) + "/" + RIGHT(DateString,4)))
如果您愿意,可以将(dt_date)
切换为其他日期格式,并且该类型广播会自动设置Data Type
上的Derived Column
。然后在destination
地图中将new derived column
映射到destination column
,而不是source
中的原始列。
这就是你完成的,没有脚本。
如何通过脚本进行操作
如果您希望继续使用脚本并且可能注入一些额外的逻辑而不是简单的转换,那么您可以通过transformation
中的script component
data flow task
来解决此问题。它将取代上面的derived column
转换,但基本上只能通过脚本执行相同的操作。我正在这里采取措施,我猜你已经知道了一些其他人偶然发现的帖子。
Inputs and Outputs
"部分并添加输出以保存新列并设置数据类型。由于您要更改数据类型,因此需要新列Input Columns
"部分并选择SampleDate
列Script
"部分并选择Visual Basic作为脚本语言。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块中,这样如果解析日期失败,它只会清除/删除记录中的值,导入将继续。我将此归结为您,因为处理无效数据更多是业务需求的问题。
答案 1 :(得分: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)