Как преобразовать дату 2000 года в SQL DATE в SSIS?

Я использую SSIS (SQL 2008) для переноса данных с AS400. Значения даты сохраняются в 400 как 7-значное число. Вот формат: "CYYMMDD" C - это "цифра века", где 0 = 1900 и 1 = 2000. Я изучал производные столбцы и компоненты скрипта. Я очень новичок в SSIS, и все необходимые кастинги в разных случаях делают меня скучным мальчиком. Также я теряю ведущие нули. Я не уверен, что это ч / б, они имеют числовой тип, и я бы видел их правильно, если я приведу их как строку или нет. Ниже приведено то, что я вижу в SQL после прямого извлечения из 400 с использованием SSIS.

AS400   =   Actual 
101         01/01/1900 (I think these are "unknown" dates)
1231        12/31/1900 (I think these are "unknown" dates)
20702       07/02/1902
151231      12/31/1915
1000102     01/02/2000
1110201     02/01/2011

5 ответов

Решение

Ни один из двух ответов не был на 100%, но оба помогли мне выяснить проблему. Не уверен, кого пометить как "правильный" Вот что я сделал. Пришлось сделать 2 производных столбца.

1. ((DT_WSTR,8)(<<AS400>> + 19000000)) 
2. (DT_DBDATE)(SUBSTRING(DCDateString,1,4) + "-" + SUBSTRING(DCDateString,5,2) + "-" + SUBSTRING(DCDateString,7,2))

Вы должны быть в состоянии использовать это выражение

(DT_DBDATE) ((DT_STR) (AS400 + 19000000))

Во-первых, добавьте начальные нули в задачу производного столбца:

RIGHT("000000000" + (DT_STR,10,1252)AS400,7)

Передайте это другой задаче "Производный столбец" и используйте выражение для выполнения преобразования в зависимости от цифры века, например:

SUBSTRING([Derived Column 2],1,1) == "0" ? (DT_UI4)[Derived Column 2] + 19000000 : (DT_UI4)SUBSTRING([Derived Column 2],2,8) + 20000000

Что должно дать вам что-то вроде 20110201. Затем вы можете преобразовать это или измельчить в части даты, как требуется.

select substring(t1.datefield,4,2)|| '/' || substring(t1.datefield,6,2) || '/' || (cast(substring(t1.datefield,1,3) as integer) + 1900) as RegularDate from db.table1 t1

Если я правильно помню, дата отметки столетия восходит не к 1900 году, а скорее к произвольной дате. Возможно, вы захотите проверить справочники AS400, связанные с датами 2000 года. Я программировал на AS400 с 1992 по 2005 годы. Годы перерыва - 1939 и 2039. Дата до или после них соответственно не соответствует системе отметок века. Это связано с тем, что IBM решила, что любые двухзначные числа, превышающие 39, относятся к 1900-м годам, а все, что меньше или равно 39, относятся к 2000-м годам. Если вы имеете дело с будущими датами, это может вызвать затруднение.

Другие вопросы по тегам