2017-04-26 34 views
3

我有一个SSIS包,它将一些数据从Oracle传输到SQL Server。CAST vs ssis数据流隐式转换差异

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

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

注:此号,源数据类型为DT_R8,在数据转换成分变更类型DT_UI4改变不了什么

任何人都可以解释一下吗?

回答

0

关于日期连续

存储在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天用它来转换日期连续剧

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

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

select CAST(36464 - 2 as SmallDateTime) 
根据本 Microsoft docs article

“DBTYPE_DATE

SSIS隐式转换

另外(这是一个自动化DATE类型。它在内部被表示为双..整个部分是自1899年12月30日以来的天数,小数部分是一天中的一小部分。这种类型的精确度为1秒,因此有效比例为0。)”

在SSIS所以隐式转换铸造日期时,考虑作为初始值的价值1899-12-30,所以用它来转换日期连续剧

+0

谢谢您的答复时,有没有必要。减去2天。我知道它的区别,事实上我在我的Oracle查询中写了 - 2。问题是我最终得到了-4!不知怎的,它看起来像集成服务“知道”这应该像日期和减另一个2.正如我写的,如果我从管理工作室和SSIS包中明确插入相同的(整数)值到datetime中,我会得到两个不同的日期。 – avb

+0

在ssis中,如何将整数转换为date? – Hadi

+0

明确地说,我不是。我只是将odbc源中的整数列映射到数据流任务中的oledb目标中的datetime列。源SSIS数据类型是DT_R8。 – avb