Ssis 使用SSI将数据从Oracle复制到SQL Server时处理时间戳/日期时间

Ssis 使用SSI将数据从Oracle复制到SQL Server时处理时间戳/日期时间,ssis,Ssis,我正在使用SSIS将数据从Oracle中的表复制到SQL Server 2005中的表。不需要转换,所以它只是一条连接OLEDB源和OLEDB目标的直线。非常简单且有效,但在执行过程中,Oracle表中的记录包含的时间戳值为遇到的年份0002,因此SSIS会因oveflow异常而出错 如果我在SQL Server中创建了一个数据类型为string的额外列,并重新映射,那么就可以了。然而,我更喜欢保留Datatime列并在我的目的地中使用它。我可以用1900年之类的东西来代替0002年。那么,在S

我正在使用SSIS将数据从Oracle中的表复制到SQL Server 2005中的表。不需要转换,所以它只是一条连接OLEDB源和OLEDB目标的直线。非常简单且有效,但在执行过程中,Oracle表中的记录包含的时间戳值为遇到的年份0002,因此SSIS会因oveflow异常而出错


如果我在SQL Server中创建了一个数据类型为string的额外列,并重新映射,那么就可以了。然而,我更喜欢保留Datatime列并在我的目的地中使用它。我可以用1900年之类的东西来代替0002年。那么,在SSIS中实现这一点的最佳方法是什么

我通常让Oracle在我的源查询中使用类似的方法来处理这一问题:

CAST( Coalesce (
CASE 
 WHEN TO_CHAR(Effective_Date,'yyyy-mm-dd HH24:MI:SS') < '1900-01-01 00:00:00' 
       THEN TO_DATE('9999-12-31 00:00:00','yyyy-mm-dd HH24:MI:SS') 
 ELSE Effective_Date 
END ,TO_DATE('9999-12-31 00:00:00','yyyy-mm-dd HH24:MI:SS')) AS DATE) AS Effective_Date
CAST(合并)(
案例
何时发送字符(生效日期'yyyy-mm-dd HH24:MI:SS')<'1900-01-01 00:00:00'
然后到日期('9999-12-31 00:00:00','yyyy-mm-dd HH24:MI:SS')
其他生效日期
结束,截止日期(“9999-12-31 00:00:00”,“yyyy-mm-dd HH24:MI:SS”)为生效日期

这将设置一个有效但非常未来的日期(由我与之签订合同的公司指定,作为必填日期字段中无效日期的表示。您也可以使用
'1900-01-01 00:00:00'
而不是
'9999-12-31 00:00:00'
)如果原始日期为
null
或小于
1900-01-01 00:00:00
。它还可以避免SSI对日期字段进行后期处理。

我知道您已经找到了所需的修复方法,但处理此类问题的另一种方法是使用条件拆分。您可以找到并处理各种各样的数据问题,其中需要从主流中删除记录,并使用条件拆分对其进行特定处理。当我希望能够告诉供应商他们发送给我们的不良记录,以便他们能够修复数据时,我发现它特别方便

为什么还要将空值映射到
99991231
?在这种情况下,有什么东西需要这个或那个只是你自己要求的一部分吗?@emtucif如果这是业务部门的要求,他们想使用99991231作为invaild/未知日期标记,以便从报告中轻松筛选出这些值。这是有道理的。我更喜欢使用99991231而不是NULL。它实际上也会影响性能(StartDate和EndDate之间的
GetDate()比任何试图处理空值的方法都要好得多)。谢谢@Jondlm。我喜欢你对这个答案所做的格式更改!