将存储为DT_STR的日期转换为DT_DBDATETIMEOFFSET

时间:2019-05-19 09:14:51

标签: sql sql-server datetime ssis etl

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

enter image description here

在文本文件中

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

enter image description here

在目标表中:

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

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

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

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

我用

表示

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_INDUCEDTRANSFORMFAILUREONERROR。 “派生列”失败   因为发生错误代码0xC0049064,并且错误行的配置   关于“派生的Column.Outputs [派生的列输出] .Columns [预测的””   指定错误失败。指定的对象发生错误   指定组件的。之前可能发布了错误消息   并提供有关失败的更多信息。

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

对于Col2,我如何为Switchoffset(exp)写一个表达式-该日期时间列和加载时间为5小时?

1 个答案:

答案 0 :(得分:2)

预计交货日期空处理

您可以添加具有以下表达式的派生列:

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

ScanDateTime偏移量处理

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

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;

    }
}

参考文献