Pregunta

Estoy usando SSIS (SQL 2008) para traer datos de un AS400. Los valores de fecha se almacenan en el 400 como un numérico de 7 dígitos. Aquí está el formato: "CyyMMDD" C es un "dígito del siglo" donde 0 = 1900 y 1 = 2000. He estado buscando columnas derivadas y componentes de script. Soy muy nuevo en SSIS y todo el casting requerido compuesto con diferentes casos me hace un niño aburrido. Además, estoy perdiendo ceros principales. No estoy seguro de si eso es b/c, son de tipo numérico y los vería correctamente si me lanza como cadena o no. A continuación se muestra lo que estoy viendo en SQL después de un tirón directo del 400 usando 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
¿Fue útil?

Solución 3

Ninguna de las dos respuestas fue del 100%, pero ambas me ayudaron a descubrir el problema. No estoy seguro de a quién marcar como "correcto" aquí es lo que hice. Tuvo que hacer 2 columnas derivadas.

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

Otros consejos

Deberías poder usar esta expresión

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

En primer lugar, agregue los cero líderes en una tarea de columna derivada:

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

Pase esto a otra tarea de columna derivada y use una expresión para realizar la conversión dependiendo del dígito del siglo, algo así como:

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

Lo que debería darle algo como 20110201. Luego puede convertir esto, o triturarlo en piezas de fecha según sea necesario.

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

Si recuerdo correctamente, la fecha de la marca del siglo no se remonta a 1900, sino que tenía que ver con una fecha arbitraria. Es posible que desee consultar los Redbooks AS400 relacionados con las fechas Y2K. Programé en el AS400 de 1992 a 2005. Los años de descanso son 1939 y 2039. Fecha antes o después de estos, respectivamente, fallan bajo el sistema Century Mark. Esto se debe a que IBM decidió que cualquier año de dos dígitos mayor de 39 se refirió a la década de 1900, cualquier cosa menos que 39 referido a la década de 2000. Si está tratando con fechas futuras, esto podría causar un problema.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top