Question

J'utilise SSIS (SQL 2008) pour apporter des données sur d'un AS400. Les valeurs de date sont stockées dans le 400 comme un numérique à 7 chiffres. Voici le format: « CYYMMDD » C est un « siècle chiffre » 0 = 1900 et 1 = 2000. Je suis à la recherche dans les colonnes dérivées et des composants de script. Je suis très nouveau pour SSIS et tout le nécessaire coulée mélangé avec différents cas me rend un garçon terne. De plus, je suis en train de perdre des zéros à gauche. Je ne sais pas si cela est b / c ils sont de type numérique et je les voir correctement si je jetai sous forme de chaîne ou non. Voici ce que je vois dans SQL après une traction directe du 400 en utilisant 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
Était-ce utile?

La solution 3

Aucune des deux réponses étaient 100%, mais les deux m'a aidé à comprendre le prob. Je ne sais pas à qui marque comme « correcte » Voici ce que je faisais. Nous avons dû faire 2 colonnes dérivées.

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

Autres conseils

Vous devriez être en mesure d'utiliser cette expression

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

Tout d'abord, ajouter le zéro est dans une tâche de colonne dérivée:

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

Passez ce à une autre tâche de colonne dérivée, et utiliser une expression pour effectuer la conversion en fonction du siècle chiffre, quelque chose comme:

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

Ce qui devrait vous donner quelque chose comme 20110201. Vous pouvez ensuite convertir ce ou déchiqueter en parties de date, au besoin.

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 je me souviens bien, la marque siècle la date n'a pas revenir à 1900, mais a dû faire avec une date arbitraire. Vous pouvez consulter les redbooks AS400 liées aux dates de Y2K. Je programmé sur le AS400 de 1992 - 2005. Les années 1939 sont break et 2039. La date avant ou après ceux-ci échouent respectivement sous le système de marque siècle. En effet, IBM a décidé que toute année à deux chiffres supérieure à 39 fait référence aux années 1900, quoi que ce soit inférieur ou égal à 39 fait référence aux années 2000. Si vous faites affaire avec des dates futures, cela pourrait provoquer un accroc.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top