是否有更好的方法来解析SSIS中的[Integer]。[Integer]样式日期?

时间:2017-05-31 14:44:58

标签: sql-server ssis etl ssis-2012

我正在处理SSIS ELT脚本,该脚本需要解析TSV文件中的日期,这些日期以[INTEGER].[INTEGER]格式存储(Excel integer dates,然后是午夜后的第二个,例如,42825.94097;或自午夜起的微秒,例如,42831.1229166667)。我提出了以下方法:

  1. 派生列功能,将输入拆分为日期部分和时间部分
  2. 派生列函数,用于将解析后的日期附加在一起,例如,

    DATEADD("day",StartTime_Date,DATEADD("second",StartTime_Time,(DT_DATE)"1/1/1900"))
    
  3. 有没有一种更优雅的方法可以在不使用脚本组件的情况下执行此操作?

1 个答案:

答案 0 :(得分:1)

“DT_DATE数据类型使用8字节浮点数实现。天数以整数增量表示,从1899年12月30日开始,午夜表示为时间零。小时值表示为绝对值数字的小数部分的值。但是,浮点值不能代表所有实际值;因此,DT_DATE中可以显示的日期范围有限制。“ Read more

从上面的描述中可以看出在将它们转换为8字节浮点数DT_DATE后将它们映射到DT_R8列时,可以隐式转换这些值。 /强>

使用派生列转换将此列转换为8字节浮点数:

(DT_R8)[dateColumn]

然后将其映射到DT_DATE

或投两次:

(DT_DATE)(DT_R8)[dateColumn]

<强>实验

我用一个DataFlow Task

创建了一个SSIS包

DataFlow任务包含一个脚本组件(作为源),它生成一个输出行(DT_R8类型的一列),其值为42825.94097

脚本组件链接到派生列,该列使用以下表达式将此列转换为DT_DATE

(DT_DATE)[Column]

我得到的输出如下所示

enter image description here

相关答案

我有很多与这个问题相关的答案: