【问题标题】:Oracle equivalent of teradata timezones相当于 teradata 时区的 Oracle
【发布时间】:2015-11-09 22:45:21
【问题描述】:

我正在尝试将以下 Teradata SQL 转换为 Oracle。问题是我无法在 Oracle 中找到等效的时区值。在下面的示例中,Oracle 无法识别“Europe Central”。

select  hi.create_date 
 , to_char( hi.create_date,'YYYY-MM-DD HH24:MI:SS') 

   , ((CAST(to_char( hi.create_date,'YYYY-MM-DD HH24:MI:SS')||'+00:00' AS TIMESTAMP(0)))   at time zone  'Europe Central')
from historical_info hi 

Oracle 中的以下代码会引发错误:

SELECT create_date,
   CAST(  create_date 
          AS TIMESTAMP WITH TIME ZONE 
    ) AT TIME ZONE 'Europe Central'  
    TZ_LOSANG
FROM historical_info

ORA-01878: specified field not found in datetime or interval.
01878. 00000 - "specified field not found in datetime or interval"
*Cause: The specified field was not found in the datetime or interval.
*Action: Make sure that the specified field is in the datetime or interval.

您能否帮我将 Teradata 时区转换为 Oracle 识别的时区。

【问题讨论】:

  • 您遇到什么错误?欧洲有没有一个城市可以作为该地区的示例?
  • 收到以下错误。 ORA-01878: 在日期时间或间隔中找不到指定的字段。 01878. 00000 - “在日期时间或间隔中未找到指定字段” *原因:在日期时间或间隔中未找到指定字段。 *Action:确保指定的字段在日期时间或时间间隔内。
  • 不,我没有任何特定的城市。由于我在 Teradata 中的当前数据没有按城市分类的时区,因此我无法对应 Oracle 中的等效时区,该时区具有欧洲/都柏林、欧洲/泽西等时区值。

标签: oracle teradata


【解决方案1】:

您可以获取支持的时区列表,as shown in the documentaion

您可以通过输入以下语句从随数据库安装的时区文件中获取时区名称和时区缩写列表:

SELECT TZNAME, TZABBREV 
FROM V$TIMEZONE_NAMES
ORDER BY TZNAME, TZABBREV;

没有一种简单的内置方法可以将 Teradata 名称转换为 Oracle 名称,因此您需要为您必须处理的每个区域/区域选择一个合适的等效名称。

Oracle 没有“欧洲/中部”时区名称,但可以识别 CET 缩写或映射到该缩写的任何名称:

alter session set nls_timestamp_tz_format = 'YYYY-MM-DD HH24:MI:SS TZR';

with historical_info(create_date) as (select sysdate from dual)
SELECT create_date,
  CAST(create_date AS TIMESTAMP) AT TIME ZONE 'CET' TZ_AT_CET
FROM historical_info;

CREATE_DATE         TZ_AT_CET
------------------- -----------------------
2015-08-17 11:59:29 2015-08-17 12:59:29 CET

但这正在将时间从我的会话时区调整为 CET,这可能不是您想要的。如果您说存储的时间代表 CET,那么您需要 from_tz 函数:

SELECT create_date,
  CAST(create_date AS TIMESTAMP) AT TIME ZONE 'CET' TZ_AT_CET,
  FROM_TZ(CAST(create_date AS TIMESTAMP), 'CET') TZ_FROM_CET
FROM historical_info;

CREATE_DATE         TZ_AT_CET               TZ_FROM_CET
------------------- ----------------------- -----------------------
2015-08-17 12:01:40 2015-08-17 13:01:40 CET 2015-08-17 12:01:40 CET

从您的列别名中,您可能试图在不同的区域显示 CET 时间,这需要两个步骤:

SELECT create_date,
  FROM_TZ(CAST(create_date AS TIMESTAMP), 'CET') TZ_FROM_CET,
  FROM_TZ(CAST(create_date AS TIMESTAMP), 'CET')
    AT TIME ZONE 'America/Los_Angeles' TZ_LOSANG
FROM historical_info

CREATE_DATE         TZ_FROM_CET             TZ_LOSANG
------------------- ----------------------- ---------------------------------------
2015-08-17 12:02:55 2015-08-17 12:02:55 CET 2015-08-17 03:02:55 AMERICA/LOS_ANGELES

如果您有具有不同区域的行,并且这些行目前存储为单独的列,您可以使用 case 表达式(或解码)为每个区域指定 Oracle 等效项;但是您仍然必须自己进行此映射。如果这不是一次性任务,您可以将翻译放入查找表中。

with historical_info(create_date, orig_zone) as (
  select sysdate, 'Europe Central' from dual
  union all select sysdate, 'Europe Western' from dual
  union all select sysdate, 'America Central' from dual
)
SELECT create_date,
  FROM_TZ(CAST(create_date AS TIMESTAMP),
    case orig_zone
      when 'Europe Central' then 'CET'
      when 'Europe Western' then 'WET'
      when 'America Central' then 'US/Central'
      -- when x then y for all other values you need
    end) TZ_ADJUSTED
FROM historical_info

CREATE_DATE         TZ_ADJUSTED
------------------- --------------------------------------
2015-08-17 12:16:13 2015-08-17 12:16:13 CET
2015-08-17 12:16:13 2015-08-17 12:16:13 WET
2015-08-17 12:16:13 2015-08-17 12:16:13 US/CENTRAL

您需要小心使用根据夏令时进行适当调整的时区(或缩写)。

【讨论】:

    猜你喜欢
    • 2018-09-28
    • 2015-04-27
    • 2011-06-26
    • 2017-05-12
    • 2019-03-13
    • 2012-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多