Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql CAST与ssis数据流隐式转换差异_Sql_Sql Server_Oracle_Ssis_Etl - Fatal编程技术网

Sql CAST与ssis数据流隐式转换差异

Sql CAST与ssis数据流隐式转换差异,sql,sql-server,oracle,ssis,etl,Sql,Sql Server,Oracle,Ssis,Etl,我有一个SSIS包,它将一些数据从Oracle传输到SQL Server 在Oracle中,日期存储为浮点数,例如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,将数

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

在Oracle中,日期存储为浮点数,例如
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

有关日期序列的更多信息,请访问:

铸造法 发件人:

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

<> >代码> Case< /Case>函数,将值<代码> 1900—01-01 视为铸造日期的初始值。因此,我们需要在使用它转换日期序列时减去2天

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

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

select CAST(36464 - 2 as SmallDateTime)
SSIS隐式转换 也根据这个

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


在SSIS中,隐式转换将数值“代码> 1899—1230</代码>作为铸造日期的初始值。因此,在使用它转换日期序列时,无需减去2天

谢谢您的回复。我知道其中的区别,事实上,我在Oracle查询中编写了select-2。问题是我最终得到了-4!不知何故,看起来IntegrationServices“知道”这应该像日期一样对待,并减去另一个2。正如我所写的,如果我从management studio和SSIS包显式地将相同的(整数)值插入datetime,我会得到两个不同的日期。在SSIS中,如何将整数转换为日期?显式地,我不是。我只是将odbc源中的整数列映射到数据流任务中oledb目标中的datetime列。源SSIS数据类型为DT_R8。
“DBTYPE_DATE(这是一种自动日期类型。它在内部表示为双精度。整个部分是自1899年12月30日以来的天数,小数部分是一天的小数。此类型的精度为1秒,因此有效刻度为0)。”
就是这样:)我必须说我觉得有点奇怪,微软在不同的工具中使用不同的方法,甚至在一个工具中使用不同的方法,集成服务是sql server的一部分。无论如何,非常感谢你。