【问题标题】:Convert date stored as DT_STR to DT_DBDATETIMEOFFSET将存储为 DT_STR 的日期转换为 DT_DBDATETIMEOFFSET
【发布时间】:2019-10-05 23:07:24
【问题描述】:

我有分隔文本文件,我将在其中加载到数据库表中 如何将 DT_STR col 加载到 DT_DBDATE ,DT_STR 到 DT_DATETIME。

在文本文件中

COL1 : Predicted delivery date : DT_STR
COL2  : ScanDateTime : DT_STR

在目标表中:

COL1 : Predicted delivery date : DATE  (DataType)
COL2  : ScanDateTime : DATETIME 

我需要以以下格式加载数据

Switchoffset (Substring(ScanDateTime , 1, 22)+':'+Substring(ScanDateTime , 23, 24),'-05:00')

我试图使用派生列将此数据加载到目标表中:

我给了这个表达

COL 1:

(DT_DBDATE)LEFT([Predicted Delivery Date],10)

COL 2:

(DT_DATE)(SUBSTRING([ScanDateTime ],1,4) + "-" + SUBSTRING([ScanDateTime ],5,2) + "-" + SUBSTRING([ScanDateTime ],7,2),'-05:00')

但两者都给出错误:

[派生列2] 错误:尝试 执行类型转换。 [派生列2] 错误:SSIS 错误代码 DTS_E_INDUCEDTRANSFORMFAILUREON错误。 “派生列”失败 因为发生了错误代码 0xC0049064,并且错误行处置 关于“派生列.输出[派生列输出].列[预测]” 指定错误失败。指定对象发生错误 的指定组件。之前可能有错误信息发布 这包含有关失败的更多信息。

对于 Col1,我需要如何处理 Null 值并将数据加载到日期格式的目标表中?

对于 Col2,我如何为该日期时间列编写 Switchoffset (exp) - 5hrs 的表达式并加载?

【问题讨论】:

    标签: sql sql-server datetime ssis etl


    【解决方案1】:

    预计交货日期 Null 处理

    您可以使用以下表达式添加派生列:

    (ISNULL([Predicted delivery date]) || [Predicted delivery date] == "") ? 
    NULL(DT_DATE) : 
    (DT_DATE)[Predicted delivery date]
    

    ScanDateTime 偏移处理

    您可以通过添加脚本组件转换来解决此问题,选择 ScanDateTime 作为输入列并添加一个名为 outDate 的类型为 DT_DBDATETIMEOFFSET 的新列,在脚本中使用以下代码:

    public override void Input0_ProcessInputRow(Input0Buffer Row) 
    { 
        if (!Row.ScanDateTime_IsNull && !String.IsNullOrEmpty(Row.ScanDateTime)){
    
            DateTime dtDate = DateTime.Parse(Row.ScanDateTime);
            dtDate = DateTime.SpecifyKind(dtDate, DateTimeKind.Unspecified);
            DateTimeOffset offDate = new DateTimeOffset(dtDate,
                                   TimeZoneInfo.FindSystemTimeZoneById("Central Standard Time").GetUtcOffset(dtDate));
    
            Row.outDate = offDate;
    
        }else{
    
            Row.outDate_IsNull = True;
    
        }
    }
    

    参考文献

    【讨论】:

    • 我在 Derived 列中使用了名为 outdate 的 DT_DBDATETIMEOFFSET,用作脚本组件中的输出
    • 我需要如何将过时的列放入脚本组件中
    • @mohan111关于ScanDateTime,忘记派生列只需添加一个脚本组件,双击它,在Inputs and Outputs中展开Output 0并单击Output Columns。按Add Column添加输出列
    • @mohan111 检查以下链接以获取分步教程sqlshack.com/ssis-script-component-vs-derived-column
    • 成功了,感谢您的支持和指导
    猜你喜欢
    • 2016-09-22
    • 2013-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-01
    • 2015-02-26
    相关资源
    最近更新 更多