CAST与ssis数据流隐式转换差异

时间:2017-04-26 13:34:46

标签: sql sql-server oracle ssis etl

我有一个SSIS包,可以将一些数据从Oracle传输到SQL Server。

在Oracle中,日期存储为float,例如42824 == '2017-04-01' - 使用数据库的应用程序是用Delphi编写的。

select CAST(42824 as datetime) 在Management Studio中生成'2017-04-01 00:00:00.000',包中插入到SQL Server表的datetime列中的相同值(42824)显示2017-03-30 00:00:00.000

注意:此数字的源数据类型为DT_R8,将数据转换组件中的类型更改为DT_UI4

任何人都能解释一下吗?

1 个答案:

答案 0 :(得分:2)

关于日期连续出版物

存储在Oracle中的值(42824)称为日期序列,它也在Microsoft Excel中使用。

日期序列表示日期值与初始值1899-12-30

之间的天数

您可以在以下位置阅读有关日期序列的更多信息:

CAST方法

来自Microsoft Docs - CAST and CONVERT (Transact-SQL)

  

仅在从字符数据转换为datetime或smalldatetime时受支持。当仅表示日期或仅表示时间组件的字符数据强制转换为datetime或smalldatetime数据类型时,未指定的时间组件设置为00:00:00.000,未指定的日期组件设置为1900-01-01

因此CAST函数在投射日期时会将值1900-01-01视为初始值。所以我们需要在使用它来转换日期序列时减去2天

有两种方法可以使用SQL Server将其转换为日期:

select DATEADD(d,42824,'1899-12-30')

select CAST(36464 - 2 as SmallDateTime)

SSIS隐式转换

同样根据Microsoft docs article

  

DBTYPE_DATE(这是一个自动DATE类型。它在内部表示为double ..整个部分是自1899年12月30日以来的天数,小数部分是一天的分数。这种类型具有准确性1秒,因此有效等级为0.。

因此,SSIS中的隐式转换会在投射日期时将值1899-12-30视为初始值。因此,使用它来转换日期序列

时,无需减去2天