【问题标题】:Convert varchar to datetime using VB script使用 VB 脚本将 varchar 转换为日期时间
【发布时间】:2016-07-05 10:40:59
【问题描述】:

我需要使用 .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

附: :我不是在寻找用于转换的 SQL 查询,所以在发表评论之前,请仔细阅读整个问题。我正在寻找 VB 代码而不是 SQL 代码。

【问题讨论】:

  • 在提出新问题之前,您应该真正检查是否尚未提供答案:stackoverflow.com/questions/21833719/…
  • 亲爱的 BIDeveloper,如果您认为答案已经存在,请告诉我。相信我,我已经尝试了一切,但我的 VB 代码没有将 DDMMYYYY 转换为 YYYY-MM-DD HH:MM:SS 格式。
  • 这不是VBScript,它看起来更像VB.Net,尤其是使用Convert.ToDateTime()方法。
  • 如果这是 vb.net 而不是 vbscript,则查找 Date.ParseExact

标签: vb.net datetime ssis varchar


【解决方案1】:

只需翻转fromdt = Row.SampleDate

Row.SampleDate = fromdt

您的脚本应该可以工作,但如果您愿意,请参阅下文以简化一些。

如何在没有脚本的情况下进行操作——脚本方法见下文

如果您改用Derived Column 转换,您可以让这一切变得更简单!数据转换转换不起作用,因为它不允许您操作列的值,而只能操作数据类型。但是在派生列中,您可以剪切字符串并将结果转换为日期。

所以数据流中的源到派生列到目标。

在派生列中添加一个新列并将以下内容用作表达式(将 DateString 替换为包含 ddMMyyyy 格式的日期的 name of your column

然后将其用作Expression

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

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

这就是你的工作,没有脚本。

如何通过脚本来实现

如果您想保留脚本并可能注入一些额外的逻辑而不是简单的转换来解决路由问题,您可以通过data flow task 中的transformation script component 来完成。它将取代上面的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

正如 cmets 中的@Shiva 建议的那样,您可以扩展它并使用 TryParseExact 或将其包装在 try catch 块中,这样如果解析日期失败,它只会从记录中清除/删除值,然后导入将继续。我把这留给你,因为处理无效数据更多的是业务需求问题。

【讨论】:

  • That's it your done, no scripts. You of course can do it via a script but I don't see why would when the standard options are available to your。您的解决方案仅假定“幸福之路”。源日期字段的类型为 varchar。这意味着它也可能包含无效数据。使用脚本可以提供更好的控制,因为您可以在该字段上执行 TryParse 并仅在成功时转换为日期。即使存在有效日期,这种派生列方法也会失败,这不是完全采用DDMMYYYY 格式。也就是说,我已为您的努力 +1。
  • @Shiva OP 明确表示 1 格式,并没有提及潜在的有效性问题。我绝对可以看到使用脚本任务来测试有效性的原因。但是问题是如果无效,您想做什么,仍然导入?这导致无效日期的值应该是多少? Null 如果目的地不允许 Null 怎么办,导入仍然会失败.....在某些时候需要做出数据有效性的决定,通常我总是希望它们失败,直到我能找到纠正的模式/发现方法无效的日期,而不是悄悄地成功。 PS 我使用更复杂的脚本
  • 感谢您的澄清。现在说得通了。
  • @Shiva 我决定也添加脚本方法。
  • 太棒了!这使它现在成为一个完整的答案:)
【解决方案2】:

要将字符串转换为 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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-06-07
    • 1970-01-01
    • 2019-12-23
    • 2019-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-05
    相关资源
    最近更新 更多