質問

SSIS(SQL 2008)を使用して、AS400からデータを持ち込みます。日付値は、7桁の数値として400に保存されます。形式は次のとおりです。「cyymmdd "cは、0 = 1900および1 = 2000です。派生列とスクリプトコンポーネントを検討しています。私はSSISに非常に新しいもので、異なるケースで複合された必要なキャスティングはすべて私を退屈な男の子にしています。また、私は主要なゼロを失っています。それがb/cであるかどうかはわかりませんが、それらは数値タイプであり、文字列としてキャストする場合は正しく表示されます。以下は、SSIを使用して400から直接引っ張った後、SQLで見ているものです。

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
役に立ちましたか?

解決 3

2つの回答のどちらも100%ではありませんでしたが、どちらも私が問題を理解するのに役立ちました。誰が私がしたことが「正しい」とマークするかわからない。 2つの派生列を実行する必要がありました。

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

他のヒント

この表現を使用できるはずです

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

まず、派生した列タスクに先頭のゼロを追加します。

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

これを別の導出された列タスクに渡し、式を使用して、次のような世紀の数字に応じて変換を実行します。

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

これにより、20110201のようなものが得られます。その後、これを変換するか、必要に応じて日付部に細断することができます。

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

私が正しく思い出せば、センチュリーマークの日付は1900年に戻るのではなく、むしろ任意の日付に関係していました。 Y2K日付に関連するAS400 Redbookを確認することをお勧めします。私は1992年から2005年までAS400でプログラムしました。休憩年は1939年と2039年です。これは、IBMが39を超える2桁が1900年代に言及されており、2000年代に言及されている39以下であると判断したためです。将来の日付を扱っている場合、これは障害を引き起こす可能性があります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top