【问题标题】:Convert Date field for Oracle GoldenGate转换 Oracle GoldenGate 的日期字段
【发布时间】:2019-04-28 14:43:48
【问题描述】:

我有一个 Oracle GoldenGate 设置,其中 Oracle 数据库作为我的源和一个非 Oracle 目标。我的源数据库位于时区 A。有没有办法配置我的提取/复制,以便我的目标中的所有数据都采用 UTC 或某些可自定义的时区 B?

为了更清楚,假设我在 EST 中有一个数据库,其中我有一个值为 2018-11-26 17:01:49 的日期列,我希望将数据转换为 UTC,并且复制的值将是 2018-11-26 22:01:49。有没有一种干净的(或任何)方法来实现这一点?

【问题讨论】:

    标签: oracle-golden-gate


    【解决方案1】:

    此转换仅适用于 REPLICAT。它对时间进行了完整的计算,并从名为 dt 的源日期列转到名为 dt5 的目标列,该列将转换为日期 + 5 小时(您可以将其调整为必须转换的任何时区数据)。它假设您的源表是t4,目标表是t4_copy(对于SCHEMA scratch

    MAP scratch.t4, TARGET scratch.t4_copy,
    COLMAP ( USEDEFAULTS,
    dt5 = @DATE ('YYYY-MM-DD HH:MI:SS', 'JTS',
    @COMPUTE (@DATE ('JTS', 'YYYY-MM-DD HH:MI:SS', dt) + 18000000000 ) ) 
    );
    

    JTS(Juilan 时间戳)生成可以在数值表达式中使用的数字。单位是微秒(这就是+18000000000 的原因)

    【讨论】:

    • 我认为这不适用于我的情况。 1. 我希望这种转换发生在所有表中,而不必手动映射每个表/字段。 2. 偏移量应该是从一个时区到另一个时区。这种转换会根据夏令时而改变。具有固定偏移值的儿子将不起作用。
    • 嗯,您可以使用 PRESERVETARGETTIMEZONE 和 SOURCETIMEZONE 参数,但我很确定这些仅用于跟踪文件中的元数据。因此,除非数据与该元数据相关联,否则我怀疑它会在没有转换的情况下发生变化。在任何情况下,您都必须指定要转换的列(如果您有一些不想转换的日期/时间戳列怎么办?)。如果您希望转换所有日期列,您可以执行 SELECT column_name FROM all_tabs_columns WHERE data_type ='DATE' AND owner = 'scratch'; 并找到一种方法将 dt5 替换为该输入
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-22
    • 2013-04-14
    • 2012-01-16
    • 1970-01-01
    相关资源
    最近更新 更多