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

avb*_*avb 5 sql sql-server oracle ssis etl

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

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

select CAST(42824 as datetime)
在Management Studio导致'2017-04-01 00:00:00.000',相同的值(42824)插入由封装成在SQL Server表显示日期时间列2017-03-30 00:00:00.000

注意:此数字的源数据类型为DT_R8DT_UI4在数据转换组件中将类型更改为不会更改任何内容

谁能解释一下?

Had*_*adi 2

关于日期系列

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

日期序列表示日期值与初始值之间的天数1899-12-30

您可以在以下位置阅读有关日期连续剧的更多信息:

铸造法

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

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

因此,CAST函数在转换日期时将该值视为1900-01-01初始值。所以我们在使用它转换Date Serials时需要减去2天

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

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

select CAST(36464 - 2 as SmallDateTime)
Run Code Online (Sandbox Code Playgroud)

SSIS隐式转换

另根据这篇Microsoft 文档文章

DBTYPE_DATE(这是一个自动化DATE类型。它内部表示为双精度型。整数部分是自1899年12月30日以来的天数,小数部分是一天的小数部分。该类型的精度为1秒,因此有效尺度为 0。)

因此,SSIS 中的隐式转换1899-12-30在转换日期时会将该值视为初始值。所以用它转换Date Serials时不需要减去2天