使用本地时区强制转换的Oracle时间戳在DST日期范围内具有不同的结果

时间:2018-04-13 12:37:18

标签: oracle timestamp-with-timezone

在检查时间戳转换时,我在DST范围内或之外的不同时区转换时遇到了障碍。
知道甲骨文从3月底到10月底的范围?
这些结果是否正确?

SELECT DBTIMEZONE FROM dual;
+02:00

SELECT 
TO_CHAR(CAST(TO_TIMESTAMP_TZ('2018-02-25T22:22:22+01:00','YYYY-MM-DD"T"HH24:MI:SS TZR') as timestamp with local time zone)), 
TO_CHAR(CAST(TO_TIMESTAMP_TZ('2020-04-28T20:20:20+01:00','YYYY-MM-DD"T"HH24:MI:SS TZR') as timestamp with local time zone)) 
FROM DUAL;

OUTSIDE_DST                 INSIDE_DST
25.02.18 22:22:22,000000    28.04.20 21:20:20,000000

1 个答案:

答案 0 :(得分:0)

数据类型p表示时间始终,仅在当前用户会话时区显示,即TIMESTAMP WITH LOCAL TIME ZONE

您的陈述

SESSIONTIMEZONE

实际上等于

SELECT 
   CAST(TO_TIMESTAMP_TZ('2018-02-25T22:22:22+01:00','YYYY-MM-DD"T"HH24:MI:SS TZR') as timestamp with local time zone), 
   CAST(TO_TIMESTAMP_TZ('2020-04-28T20:20:20+01:00','YYYY-MM-DD"T"HH24:MI:SS TZR') as timestamp with local time zone) 
FROM DUAL;

在当前用户会话时区返回值,没有任何问题。无论DST是否处于活动状态,SELECT TIMESTAMP '2018-02-25 22:22:20+01:00' AT TIME ZONE SESSIONTIMEZONE, TIMESTAMP '2020-04-28 20:20:20+01:00' AT TIME ZONE SESSIONTIMEZONE FROM DUAL; 表示UTC总是提前1小时。

您的+01:00很可能是区域名称,例如"洲/城市"。尝试将会话时区设置为

SESSIONTIMEZONE

然后结果将全部在ALTER SESSION SET TIME_ZONE = '+02:00';

您可以使用+02:00查询夏令时,例如:

TZD

第一次没有夏令时(即冬令时),第二次没有夏令时(即夏令时)