在Oracle数据库中调用AT TIME ZONE函数时,时区区域无效

Max*_*Max 0 oracle timezone

关于Oracle中"AT TIME ZONE"功能的一个简单问题.似乎名为CEST的时区不是此函数的有效参数,尽管它在视图中列出了V $ TIMEZONE_NAMES

select * from V$TIMEZONE_NAMES where tzname like '%Rome%';

TZNAME      TZABBREV CON_ID
----------- -------- ------
Europe/Rome LMT      0
Europe/Rome RMT      0
Europe/Rome CET      0
Europe/Rome CEST     0

SQL>
Run Code Online (Sandbox Code Playgroud)

当我尝试将时间戳转换为时区名称CET时,一切都按预期工作

SELECT TO_TIMESTAMP('2012-MAG-24 02:00:00','RRRR-MON-DD HH24:MI:SS') 
    AT TIME ZONE 'CET' "CET" 
FROM DUAL;

CET
--------------------------------
24-MAG-12 02:00:00,000000000 CET

SQL>
Run Code Online (Sandbox Code Playgroud)

当我将时区更改为CEST时,我收到此错误:

SELECT TO_TIMESTAMP('2012-MAG-24 02:00:00','RRRR-MON-DD HH24:MI:SS') 
    AT TIME ZONE 'CEST' "CEST" 
  FROM DUAL;

ORA-01882: timezone region not found

SQL>
Run Code Online (Sandbox Code Playgroud)

我的问题是:为什么CEST时区对此转换无效?

为了清楚起见,我正在运行Oracle 12c实例

Jon*_*eet 6

AT TIME ZONE获取时区名称 - 您正在传递时区缩写.这些名称位于TZNAME您向我们展示的结果列中,但您使用的是来自的值TZABBREV.缩写是一个坏主意,因为:

  • 它们不是唯一的,所以不能作为标识符.
  • 它们只适用于部分时间......所以在现代,欧洲/罗马在CET和CEST之间有所不同,正如您从表中看到的那样.如果你必须弄清楚哪个缩写实际上在特定时间有效,你也可以只指定偏移...

基本上,答案是使用'Europe/Rome'而不是'CET'.