Дата преобразования, сохраненная как DT_STR, в DT_DBDATETIMEOFFSET - PullRequest
3 голосов
/ 19 мая 2019

У меня есть текстовый файл с разделителями, который я загружаю в таблицу базы данных. Как я могу загрузить 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')

Я пытаюсь загрузить эти данные в таблицу назначения, используя столбец Производные:

Я дал это выражение для

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, а расположение строки ошибки в «Derived Column.Outputs [Вывод производного столбца] .Columns [Predicted]» указывает на ошибку при ошибке.Произошла ошибка в указанном объекте указанного компонента.Перед этим могут быть сообщения об ошибках с дополнительной информацией о сбое.

Для Col1, как мне нужно обработать нулевые значения и загрузить данные в таблицу назначения, которая имеет формат даты?

Для Col2, как я могу написать выражение для Switchoffset (exp) - 5 часов для этого столбца даты и времени и загрузить?

1 Ответ

2 голосов
/ 19 мая 2019

Прогнозируемая дата поставки. Обнуление

Вы можете добавить производный столбец со следующим выражением:

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

ScanDateTime смещение обработки

Вы можете решить эту проблему, добавив информацию компонента Script, выбрав 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;

    }
}

Ссылки

...