SSIS中的日期和时间格式

时间:2016-08-01 10:40:11

标签: sql-server datetime ssis

我有日期和时间格式:

Interval Start Time
1/13/16 1:30:00 
1/15/16 10:30:00

期望的结果

Interval Start Time
13/01/2016 13:30:00 (24 Hr)
15/01/2016 10:30:00

间隔时间为08:00至17:30。

我希望如此:13/01/2016 13:30和15/01/2016 10:30:00我在SSIS派生的专栏中设计了这个:

 (DT_DATE)(SUBSTRING([Interval Start Time],3,2) + "-" + 
 SUBSTRING([Interval Start Time],1,1) + "-" + 
 SUBSTRING([Interval Start Time],6,2) + " " +  
 SUBSTRING([Interval Start Time],9,1) == 1 ? "13" : 
 SUBSTRING([Interval Start Time],9,1) == 2 ? "14" :
 SUBSTRING([Interval Start Time],9,1) == 3 ? "15" : 
 SUBSTRING([Interval Start Time],9,1) == 4 ? "16" :  
 SUBSTRING([Interval Start Time],9,1) == 5 ? "17" : 
 "[Interval Start Time]" )
 + ":" + SUBSTRING([Interval Start Time],11,2))

我在SSIS中遇到的错误是:

  

...表达式可能包含无效令牌,不完整令牌或无效元素......

并且我不确定该公式是否正确我想要它做什么。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:1)

在此之前提出可能的解决方案之前,我希望您了解您的方法中的一些错误。使用表达式进行此复制是非常复杂且难以维护的,除了当您的Interval Start Time列具有从十月(10)到十二月(12)月的日期时,您的字符串长度将发生变化,您的硬编码解决方案将通过{{ 1}}调用将返回荒谬的数据,并在程序包运行时产生错误。

解决方案:使用脚本组件。

  1. 创建源代码后,添加脚本组件并将源链接到它。
  2. 通过在SUBSTRING标签中选择脚本组件,将其配置为包含Interval Start Time列。
  3. 添加输出列,根据需要为其命名,然后选择数据库时间戳(DT_DBTIMESTAMP)。 enter image description here
  4. 转到“脚本”选项卡,然后按“编辑脚本...”按钮。
  5. 使用以下代码覆盖Input Columns功能。

    Input0_ProcessInputRow
  6. public override void Input0_ProcessInputRow(Input0Buffer Row) { /* * Add your code here */ var str_timestamp = Row.IntervalStartTime.ToString(); string[] arr = str_timestamp.Trim().Split(' '); string[] date = arr[0].Split('/'); string[] time = arr[1].Split(':'); string formatedDate = "20" + date[2] + "-" + date[0].PadLeft(2, '0') + "-" + date[1].PadLeft(2, '0'); int hour = Convert.ToInt32(time[0]); int hour_24 = hour < 8 ? hour + 12 : hour; formatedDate += " " + hour_24 + ":" + time[1] + ":" + time[2]; Row.MyColumn = Convert.ToDateTime(formatedDate); } 中,将Row.MyColumn替换为输出列的给定名称。

  7. 在Visual Studio中保存更改并关闭编辑器。

  8. 现在您可以在脚本组件之后添加目标,您将看到所需的格式化IntervalStartTime。

    enter image description here

    如果有帮助,请告诉我。