2017-02-20 267 views
1

我想转换时间写入平面文件源的方式,所以它实际上看起来像时间(如果这是有道理的)。SSIS:如果其他派生列表达式

现在我把它当作1215630101,..等,所以它可以是4-1个字符长,所以我需要将其转换取决于列的长度。

我在Derived Column中做了这个表达式,但是我似乎无法使它工作,不确定如果我的语法错误或者是什么,表达式看起来像这样,但是我得到错误:

(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

为什么选择最复杂的错误解决方案?我想我应该得到结束 –

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)