【问题标题】:Convert String to Datetime (USING SSIS)将字符串转换为日期时间(使用 SSIS)
【发布时间】:2013-05-29 12:28:28
【问题描述】:

我想在 SQL Server 表的列(日期时间)中插入一个值“5/27/2013 16:42:37.490000”(从平面文件 (DT_STR) 读取)。如果我尝试在派生列中使用 (DT_DBDATE) 或 DT_DBTIMESTAMP 对其进行强制转换,则会出现错误。

[Derived Column [130]] Error: SSIS Error Code DTS_E_INDUCEDTRANSFORMFAILUREONERROR.  The "component "Derived Column" (130)" failed because error code 0xC0049064 occurred, and the error row disposition on "output column "Derived Column 1" (155)" specifies failure on error. An error occurred on the specified object of the specified component.  There may be error messages posted before this with more information about the failure.

我该怎么办?

谢谢

【问题讨论】:

    标签: ssis


    【解决方案1】:

    该值为 datetime2 类型。AFAIK SSIS 不支持 datetime2 。您需要将其作为字符串存储在数据库中,然后通过将其转换为 datetime2 来更新列。

    这里是Microsoft Connect Issue

    更新:使用DT_DBTIMESTAMP2,您可以将字符串转换为正确的日期时间格式

    以下代码在派生列中运行良好

    (DT_DBTIMESTAMP2,7)"2013-5-27 16:42:37.490000"
    

    这里的岁差是7。如果日期时间的格式不同,上面的代码将不起作用。例如MM/DD/YYYY HH:mm:ss.ffffff

    但是您可以使用Script component 并将不同日期时间格式的数组传递给Datetime.ParseExact 函数

    Step1:拖拽一个Script组件,新建一个DT_DBTIMESTAMP数据类型的输出列,命名为NewDate

    Step2:编写以下C#代码

    public override void Input0_ProcessInputRow(Input0Buffer Row)
     {
      string[] format = new string[] { @"M/dd/yyyy HH:mm:ss.ffffff",
                                             @"MM/dd/yyyy HH:mm:ss",
                                             @"M/d/yyyy HH:mm:ss" ,
                                             @"M/dd/yyyy HH:mm:ss.ffffff",
                                             @"MM/dd/yyyy HH:mm:ss.ffffff",
                                              @"M/d/yyyy HH:mm:ss.ffffff"};
      DateTime dt = DateTime.ParseExact(Row.Date,
                    format ,
                    CultureInfo.InvariantCulture,
                    DateTimeStyles.None);
    
      Row.newDate = dt;
     }
    

    【讨论】:

    • 感谢 Praveen 让我了解它。有什么办法可以解决这个问题?转换,如上所述,由于某些限制,不能应用。
    • @Akshay 不,该 MS Connect 链接上的条目说:“要在 SSIS 中使用 DATETIME2 类型,请使用 DT_DBTIMESTAMP2 类型。”这是不支持的 AS400 DATETIME2 类型。对于 SQL Server 类型,您只需要知道将其称为“DT_DBTIMESTAMP2”即可。
    • 我无法使用它,因此问题。你能告诉我可以使用的表达方式吗?现在 SQL 表列是(DATETIME 类型)。我怎样才能插入上面提到的值?我需要改变我的表格列类型吗???
    • 首先作为 varchar 插入一个虚拟表,然后使用执行 sql 任务将该列转换回 datetime2。
    • @Akshay:更新了我的答案
    【解决方案2】:

    我不会说这是完美的解决方案,而只是一种解决方法。 格式化输入,然后插入。使用以下表达式后的格式化数据适用于 datetime 或 datetime2。

    SUBSTRING(TMS_CREAT,(FINDSTRING(TMS_CREAT,"/",2) + 1),4) + "-" + SUBSTRING(TMS_CREAT,1,(FINDSTRING(TMS_CREAT,"/",1) - 1)) + "-" + SUBSTRING(TMS_CREAT,(FINDSTRING(TMS_CREAT,"/",1) + 1),2) + SUBSTRING(TMS_CREAT,(FINDSTRING(TMS_CREAT,"/",2) + 5),16)
    

    【讨论】:

    • 这不是一种有效的方法。此外,如果您的日期格式为示例5/7/2013 16:42:27.490000,它将失败
    • 你是对的。它从来不是用于 PROD 类型的工作。如果我在其中添加更多约束,它不会失败,但是您的解决方案无疑会更好。
    猜你喜欢
    • 1970-01-01
    • 2014-05-24
    • 1970-01-01
    • 2021-03-19
    • 1970-01-01
    • 2012-12-18
    • 2017-07-25
    • 2015-09-17
    • 1970-01-01
    相关资源
    最近更新 更多