2017-02-20 20 views
1

時間が実際に時間のように見えるように、時間がフラットファイルソースに書き込まれる方法を変換しようとしています。それは4-1文字長くできるようにSSIS:その他の派生列式

は、今私は1215630101、...などとしてそれを持っているので、私は、列の長さに応じて、それを変換する必要があります。

私は式を使ってDerived Columnでこれをやっていますが、私の構文が間違っているかどうかわかりませんが、エラーが出ます:

私は2つだけの値でそれを行うと
(LEN([TIME OCC]) == 4) ? (SUBSTRING([TIME OCC],1,2) + ":" + SUBSTRING([TIME OCC],3,2)) : (LEN([TIME OCC]) == 3) ? (SUBSTRING([TIME OCC],1,1) + ":" + SUBSTRING([TIME OCC],2,2)) : (LEN([TIME OCC]) == 2) ? (SUBSTRING([TIME OCC],1,2) + ":00") : (LEN([TIME OCC]) == 1) ? (SUBSTRING([TIME OCC],1,1) + ":00") 

はそれが完璧に動作しているよう以下のように:私は任意の助けをいただければ幸いです

LEN([TIME OCC]) == 3 ? SUBSTRING([TIME OCC],1,1) + ":" + SUBSTRING([TIME OCC],2,2) : SUBSTRING([TIME OCC],1,2) + ":" + SUBSTRING([TIME OCC],3,2) 

、ありがとうございました!

+0

どのようなエラーメッセージが表示されますか? –

+0

"無効なトークン、不完全なトークン、または無効な要素が含まれている可能性があります。整形式でないか、かっこなどの必須要素の一部が欠落している可能性があります。" - 表現を書く方法とそのどれもうまくいかないようです。 –

+0

は「10」は「00:10」を意味しますか?最も簡単なことは、ゼロをパッドに残し、分割して ':'を入れることです。次に大きなネスト式を使う必要はありません –

答えて

1

式が不完全な三項式で終了しています。私はそれを読みやすくするために、いくつかの改行やインデントを追加してい:

(LEN([TIME OCC]) == 4) ? 
(SUBSTRING([TIME OCC],1,2) + ":" + SUBSTRING([TIME OCC],3,2)) : 
    (LEN([TIME OCC]) == 3) ? 
    (SUBSTRING([TIME OCC],1,1) + ":" + SUBSTRING([TIME OCC],2,2)) : 
    (LEN([TIME OCC]) == 2) ? 
    (SUBSTRING([TIME OCC],1,2) + ":00") : 
     (LEN([TIME OCC]) == 1) ? 
     (SUBSTRING([TIME OCC],1,1) + ":00") <-- there needs to be a : with an ELSE condition here 

それが必要だ場合、私は知りませんが、私はまた、ネストされた三元表現のそれぞれの周りに括弧のセットを置きます。タブが言うように

+0

最後の部分をELSE条件にしてみました。運がない。括弧も助けなかった何かを試してみよう、今。 –

+0

あなたの投稿を編集して試した内容を追加してください。そうすれば、エラーを見つけることができます。 –

+0

エラーが発生する最も複雑なソリューションを選択するのはなぜですか?私はoveritを得るべきだと思います –

0

、最終選択肢が欠落し、これを試してみてください。

LEN([TIME OCC]) == 4 ? (DT_WSTR,2)SUBSTRING([TIME OCC],1,2) + ":" + (DT_WSTR,2)SUBSTRING([TIME OCC],3,2) 
: LEN([TIME OCC]) == 3 ?(DT_WSTR,1)SUBSTRING([TIME OCC],1,1) + ":" + (DT_WSTR,2)SUBSTRING([TIME OCC],2,2) 
: LEN([TIME OCC]) == 2 ? (DT_WSTR,2)SUBSTRING([TIME OCC],1,2) + ":00" 
: (DT_WSTR,1)SUBSTRING([TIME OCC],1,1) + ":00" 

を長さ1
私はこのヘルプを願っていて、最後の代替を想定しました。

+0

私はそれが私が行方不明だったタイプキャストだったら私は知らないが、これは働いた。ありがとうございました! –

+0

あなたはようこそ –

1

Derrivedカラムが問題を解決する最良の方法だとは思わない(より複雑かもしれません))。あなたは、スクリプトコンポーネントを追加し、入力として、あなたのコラムをマークし、新しい出力列(タイプDT_STR)を作成し、OutpoutBuffer0_ProcessInputRowメソッド内に次のコードを使用することができます。

TIMEOCCoutColumnがあなたの入力と出力の列であることを仮定すると、

If Not row.TIMEOCC_IsNull AndAslo _ 
    Not String.IsnullorEmpty(Row.TIMEOCC.trim) Then 

    Select Case Row.TIMEOCC.Trim.Length 

    Case 1 

     Row.OutColumn = Row.TIMEOCC & ":00" 
    Case 2 

     Row.OutColumn = Row.TIMEOCC & ":00" 
    Case 3 

     Row.OutColumn = Row.TIMEOCC.Substring(0,1) & ":" & Row.TIMEOCC.Substring(1,2) 
    Case 4 

     Row.OutColumn = Row.TIMEOCC.Substring(0,2) & ":" & Row.TIMEOCC.Substring(2,2) 
    Case Else 

      Row.OutColumn = "00:00" 
    End Select 

Else 

    Row.OutColumn = "00:00" 

End If 

あなたはderrived列であなたのソリューションが必要な場合にのみ

私は、これは何だと思います探している:

 ISNULL([TIME OCC]) ? "00:00" 
: (LEN([TIME OCC]) == 4 ? ((DT_WSTR,2)SUBSTRING([TIME OCC],1,2) + ":" + (DT_WSTR,2)SUBSTRING([TIME OCC],3,2)) 
: (LEN([TIME OCC]) == 3 ?((DT_WSTR,2)SUBSTRING([TIME OCC],1,1) + ":" + (DT_WSTR,2)SUBSTRING([TIME OCC],2,2)) 
: (LEN([TIME OCC]) == 2 ? ((DT_WSTR,2)SUBSTRING([TIME OCC],1,2) + ":00") 
: (LEN([TIME OCC]) == 1 ? ((DT_WSTR,2)SUBSTRING([TIME OCC],1,1) + ":00") 
: "00:00")))) 

参照

3

これらの回答はすべて複雑すぎます。あまりにも複雑です。私にとってこれはずっと複雑ではありません。

LEFT(RIGHT(("0000" + [TIME OCC]),4),2) + 
":" + 
RIGHT(RIGHT(("0000" + [TIME OCC]),4),2) 
関連する問題