1

AS400 からデータを取得するために SSIS (SQL 2008) を使用しています。日付値は、7 桁の数値として 400 に格納されます。形式は次のとおりです。「CYYMMDD」 C は、0 = 1900 および 1 = 2000 の「世紀の数字」です。派生列とスクリプト コンポーネントを調べています。私は SSIS に非常に慣れていないため、さまざまなケースを組み合わせて必要なすべてのキャストが私を退屈な少年にしています。また、先行ゼロを失っています。それが b/c かどうかはわかりませんが、それらは数値型であり、文字列としてキャストするかどうかにかかわらず、正しく表示されます。以下は、SSISを使用して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
4

5 に答える 5

2

この表現が使えるはずです

(DT_DBDATE) ((DT_STR) (AS400 + 19000000))
于 2011-02-01T21:09:38.510 に答える
1
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
于 2011-06-20T13:30:12.693 に答える
1

まず、派生列タスクで先行ゼロを追加します。

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 のようなものが得られるはずです。必要に応じて、これを変換するか、日付部分に細断処理できます。

于 2011-02-01T21:38:19.663 に答える
1

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

1. ((DT_WSTR,8)(<<AS400>> + 19000000)) 
2. (DT_DBDATE)(SUBSTRING(DCDateString,1,4) + "-" + SUBSTRING(DCDateString,5,2) + "-" + SUBSTRING(DCDateString,7,2))
于 2011-02-02T21:23:27.620 に答える