Comment convertir un Y2K date à SQL DATE SSIS?
-
28-10-2019 - |
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
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.