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

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

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

选择CAST(42824作为日期时间)
在Management Studio中导致’2017-04-01 00:00:00.000′,包中插入到SQL Server表的datetime列中的相同值(42824)显示2017-03-30 00:00:00.000.

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

有谁能解释一下?

最佳答案 关于日期连续出版物

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

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

您可以在以下位置阅读有关Date Serials的更多信息

> Why is 1899-12-30 the zero date in Access / SQL Server instead of 12/31?
> convert Excel Date Serial Number to Regular Date

CAST方法

Microsoft Docs – CAST and CONVERT (Transact-SQL)

Only supported when casting from character data to datetime or smalldatetime. When character data that represents only date or only time components is cast to the datetime or smalldatetime data types, the unspecified time component is set to 00:00:00.000, and the unspecified date component is set to 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 (This is an automation DATE type. It is internally represented as a double.. The whole part is the number of days since December 30, 1899 and the fractional part is the fraction of a day. This type has an accuracy of 1 second, so has an effective scale of 0.)

因此,SSIS中的隐式转换将值1899-12-30视为投射日期时的初始值.因此,使用它来转换日期序列时,无需减去2天

点赞