我正在尝试转换时间写入平面文件源的方式,所以它实际上看起来像时间。(如果这有意义的话)。
现在我将其作为1215
,630
,10
,1
,等等。所以它可以是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 :(得分:3)
所有这些答案都太复杂了。方式太复杂了。对我而言,这远没那么复杂:
LEFT(RIGHT(("0000" + [TIME OCC]),4),2) +
":" +
RIGHT(RIGHT(("0000" + [TIME OCC]),4),2)
答案 1 :(得分: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
我不知道是否有必要,但我还会在每个嵌套的三元表达式周围放置一组括号。
答案 2 :(得分:1)
我不认为Derrived列是解决问题的最佳方法(它可能更复杂)。您可以添加脚本组件并将列标记为输入,创建新的输出列(类型DT_STR )并在OutpoutBuffer0_ProcessInputRow
方法中使用以下代码:
假设TIMEOCC
和outColumn
是您的输入和输出列
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
如果您只想通过原始列进行解决方案
我认为这就是你要找的东西:
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 :(得分:0)
正如Tab所说,错过最后的选择,试试这个:
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的最后一个替代方案。 我希望能有这个帮助。