Вопрос

Я использую SSIS (SQL 2008), чтобы донести данные из AS400. Значения даты хранятся в 400 как 7 -значная числовая. Вот формат: «cyymmdd» c - это «цифра столетия», где 0 = 1900 и 1 = 2000. Я изучал производные столбцы и компоненты сценариев. Я очень новичок в SSIS, и все требуемые кастинги, составленные с разными случаями, делает меня скучным мальчиком. Кроме того, я теряю ведущие нули. Я не уверен, являются ли это б/C, это числовой тип, и я бы правильно их увидел, бросаю ли я как строку или нет. Ниже я вижу в 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
Это было полезно?

Решение 3

Ни один из двух ответов не был на 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 Redbooks, связанные с датами Y2K. Я запрограммировал на AS400 с 1992 по 2005 год. Годы перерыва - 1939 и 2039 год. Дата до или после этого соответственно не проходит в рамках системы Mark Century. Это связано с тем, что IBM решил, что любой двухзначный год, более 39, упоминается в 1900 -х годах, что -то меньшее или равное 39, упомянутое на 2000 -е годы. Если вы имеете дело с будущими датами, это может привести к закуски.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top