代码之家  ›  专栏  ›  技术社区  ›  Kevin Le - Khnle

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

  •  2
  • Kevin Le - Khnle  · 技术社区  · 16 年前

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

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

    2 回复  |  直到 12 年前
        1
  •  7
  •   Jondlm eckes    12 年前

    我通常让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
    

    这将设置一个有效但非常未来的日期(由我与之签约的公司指定),作为所需日期字段中无效日期的表示。你也可以用 '1900-01-01 00:00:00' 而不是 '9999-12-31 00:00:00' )如果原始日期是 null 或少于 1900-01-01 00:00:00 . 它还避免了SSIS在日期字段上进行后处理。

        2
  •  2
  •   HLGEM    16 年前

    我知道你有你想要的修复方法,但是处理此类问题的另一种方法是使用条件拆分。您可以找到并处理各种数据问题,在这些问题中,您希望从主流中删除记录,并使用条件拆分对它们进行特定的处理。当我想告诉供应商他们给我们发送的坏记录以便他们修复数据时,我发现它特别有用。

    推荐文章