Wie konvertiere ich ein Y2K -Datum in SQL -Datum in SSIS?
-
28-10-2019 - |
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
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.