我有一个SSIS包,可以将一些数据从Oracle传输到SQL Server。
在Oracle中,日期以浮点数存储,例如42824 == '2017-04-01'-用Delphi编写使用数据库的应用程序。
42824 == '2017-04-01'
而select CAST(42824 as datetime) 在Management Studio导致'2017-04-01 00:00:00.000',相同的值(42824)插入由封装成在SQL Server表显示日期时间列2017-03-30 00:00:00.000。
select CAST(42824 as datetime)
'2017-04-01 00:00:00.000'
2017-03-30 00:00:00.000
注意:此数字的源数据类型为DT_R8,DT_UI4在数据转换组件中将类型更改为不会更改任何内容
DT_R8
DT_UI4
谁能解释一下?
存储在Oracle(42824)中的值称为日期序列,它也用于中Microsoft Excel。
42824
Microsoft Excel
日期序列表示日期值和初始值之间的天数,即 1899-12-30
1899-12-30
从Microsoft Docs-CAST和CONVERT(Transact-SQL):
仅当从字符数据转换为datetime或smalldatetime时才受支持。将仅表示日期或仅时间部分的字符数据转换为datetime或smalldatetime数据类型时,未指定的时间部分设置为00:00:00.000,未指定的日期部分设置为1900-01-01
因此,CAST函数1900-01-01在转换日期时会将值视为初始值。因此,在使用它转换日期序列时,我们需要减去2天
CAST
1900-01-01
有两种使用SQL Server将其转换为日期的方法:
select DATEADD(d,42824,'1899-12-30') select CAST(36464 - 2 as SmallDateTime)
同样根据此Microsoft文档文章
DBTYPE_DATE(这是自动化的DATE类型。在内部被表示为双精度型。整体部分是自1899年12月30日以来的天数,小数部分是一天的一部分。这种类型的精度为1秒,因此有效标度为0。)
因此,SSIS中的隐式转换在1899-12-30转换日期时将值视为初始值。因此,使用它转换日期序列时无需减去2天