Frage

Ich verwende SSIS (SQL 2008), um Daten von einem AS400 zu übertragen. Die Datumswerte werden im 400 als 7 -stellige Ziffern gespeichert. Hier ist das Format: "Cyymmdd" C ist eine "Century -Ziffer", in der 0 = 1900 und 1 = 2000. Ich habe in abgeleitete Spalten und Skriptkomponenten untersucht. Ich bin sehr neu in SSIS und das gesamte mit unterschiedliche Fälle erforderliche Casting macht mich zu einem langweiligen Jungen. Außerdem verliere ich führende Nullen. Ich bin mir nicht sicher, ob das b/c ist, sie sind numerische Typen und ich würde sie richtig sehen, wenn ich als Zeichenfolge werfen oder nicht. Unten ist das, was ich in SQL nach einem direkten Zug aus den 400 mit SSIS sehe.

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
War es hilfreich?

Lösung 3

Keine der beiden Antworten war 100%, aber beide halfen mir, das Problem herauszufinden. Ich bin mir nicht sicher, wer hier als "richtig" markiert werden soll, was ich getan habe. Mussten 2 abgeleitete Spalten machen.

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

Andere Tipps

Sie sollten diesen Ausdruck verwenden können

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

Fügen Sie zunächst die führenden Zero's in einer abgeleiteten Spalte auf:

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

Geben Sie dies an eine andere abgeleitete Spalte auf und verwenden Sie einen Ausdruck, um die Konvertierung je nach Ziffer der Jahrhundert auszuführen, so etwas wie:

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

Dies sollte Ihnen so etwas wie 20110201 geben. Sie können dies dann umwandeln oder nach Bedarf in Datumseile zerlegen.

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

Wenn ich mich richtig erinnere, ging das Datum der Jahrhundertmarke nicht auf das Jahr 1900 zurück, sondern hatte vielmehr mit einem willkürlichen Datum zu tun. Möglicherweise möchten Sie die AS400 Redbooks im Zusammenhang mit den Y2K -Daten überprüfen. Ich habe vom AS400 von 1992 bis 2005 auf dem AS400 programmiert. Dies liegt daran, dass IBM entschieden hat, dass ein zweistelliges Jahr mehr als 39 auf die 1900er Jahre hinwies, etwas weniger als oder gleich 39 in den 2000er Jahren. Wenn Sie sich mit zukünftigen Daten befassen, kann dies zu einem Haken führen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top