【问题标题】:Oracle DB: Convert timestamp (CET/CEST) columns to UTC while doing Oracle export/importOracle DB:在执行 Oracle 导出/导入时将时间戳 (CET/CEST) 列转换为 UTC
【发布时间】:2019-07-22 06:02:55
【问题描述】:

我的问题是我的 oracle 数据库有 timestamp(6) 列(没有任何时间戳信息),但时间戳存储在 CET/CEST(欧洲/柏林)中。

我们需要将时间戳更正为 UTC(因为当时间从 CEST 切换到 CET 时我们已经遇到问题 - 例如 28.10.2018)

我已经找到了如何通过更新脚本完成以下操作: How to update a TIMESTAMP column to TIMESTAMP WITH TIME ZONE in Oracle

由于我们还计划从 11 迁移到 12 - 我的问题是是否也可以在转储 exp / imp (expdp / impdp) 期间完成?

【问题讨论】:

    标签: oracle timestamp utc impdp expdp


    【解决方案1】:

    正确的转换应该是这个:

     FROM_TZ(YOUR_COLUMN, 'Europe/Berlin')  AT TIME ZONE 'UTC'
    

    这会返回一个TIMESTAMP WITH TIME ZONE 值。如果您希望获得TIMESTAMP,那么您可以使用

     SYS_EXTRACT_UTC(YOUR_COLUMN, 'Europe/Berlin')
    

    但是,我不知道如何将其包含在导入/导出中。我假设你必须使用REMAP_DATA:

    CREATE OR REPLACE PACKAGE Convert_Date AS       
        FUNCTION TO_UTC(ts IN TIMESTAMP) RETURN TIMESTAMP;
    END Convert_Date;
    /
    
    
    CREATE OR REPLACE PACKAGE BODY Convert_Date AS
    
    FUNCTION TO_UTC(ts IN TIMESTAMP) RETURN TIMESTAMP
    BEGIN
        RETURN SYS_EXTRACT_UTC(ts, 'Europe/Berlin');    
    END;
    
    END Convert_Date;
    /
    

    然后使用这个导入参数:

    REMAP_DATA=[schema.]tablename.column_name:Convert_Date.TO_UTC
    

    【讨论】:

      猜你喜欢
      • 2020-08-18
      • 2019-03-31
      • 2014-05-06
      • 1970-01-01
      • 2018-09-17
      • 1970-01-01
      • 2022-11-13
      • 2022-01-11
      • 1970-01-01
      相关资源
      最近更新 更多