我有一个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
任何人都能解释一下吗?
答案 0 :(得分:2)
存储在Oracle中的值(42824
)称为日期序列,它也在Microsoft Excel
中使用。
日期序列表示日期值与初始值1899-12-30
您可以在以下位置阅读有关日期序列的更多信息:
来自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)
DBTYPE_DATE(这是一个自动DATE类型。它在内部表示为double ..整个部分是自1899年12月30日以来的天数,小数部分是一天的分数。这种类型具有准确性1秒,因此有效等级为0.。
因此,SSIS中的隐式转换会在投射日期时将值1899-12-30
视为初始值。因此,使用它来转换日期序列