Domanda

Sto usando SSIS (SQL 2008) per portare dati da un AS400. I valori della data sono archiviati nel 400 come numerico a 7 cifre. Ecco il formato: "Cyymmdd" C è una cifra "Century" in cui 0 = 1900 e 1 = 2000. Ho esaminato colonne derivate e componenti di script. Sono molto nuovo per SSIS e tutto il casting richiesto composto con casi diversi mi sta rendendo un ragazzo noioso. Inoltre, sto perdendo zeri leader. Non sono sicuro che questo sia b/c sono di tipo numerico e li vedrei correttamente se lanciassi come stringa o no. Di seguito è riportato quello che sto vedendo in SQL dopo un tiro diretto dalla 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
È stato utile?

Soluzione 3

Nessuna delle due risposte era al 100%, ma entrambe mi hanno aiutato a capire il problema. Non sono sicuro di chi contrassegnare come "corretto" qui è quello che ho fatto. Ho dovuto fare 2 colonne derivate.

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

Altri suggerimenti

Dovresti essere in grado di usare questa espressione

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

Innanzitutto, aggiungi gli zero principali in un'attività di colonna derivata:

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

Passa questo a un'altra attività di colonna derivata e usa un'espressione per eseguire la conversione a seconda della cifra del secolo, qualcosa come:

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

Che dovrebbe darti qualcosa come il 20110201. Puoi quindi convertirlo o distruggerlo in parti della data come richiesto.

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

Se ricordo bene, la data del secolo del secolo non è tornata al 1900, ma piuttosto ha avuto a che fare con una data arbitraria. Potresti voler controllare gli AS400 RedBooks relativi alle date Y2K. Ho programmato l'AS400 dal 1992 al 2005. Gli anni di pausa sono 1939 e 2039. Data prima o dopo che questi falliscono rispettivamente nell'ambito del sistema di marchio del secolo. Questo perché IBM ha deciso che qualsiasi anno di due cifre superiore a 39 si riferiva agli anni 1900, qualcosa di meno o uguale a 39 riferiti agli anni 2000. Se hai a che fare con le date future, questo potrebbe causare un ostacolo.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top