Как преобразовать дату Y2K в SQL Date в SSIS?
-
28-10-2019 - |
Вопрос
Я использую 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 -е годы. Если вы имеете дело с будущими датами, это может привести к закуски.