使用本地时区转换的 Oracle 时间戳在 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

数据类型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;

实际上等于

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;

值以当前用户会话时区返回,没有任何问题。+01:00表示始终提前 1 小时 UTC,无论 DST 是否处于活动状态。

您的SESSIONTIMEZONE很可能是区域名称,例如"大陆/城市"。例如,尝试将会话时区设置为

ALTER SESSION SET TIME_ZONE = '+02:00';

那么结果将全部+02:00

您可以使用TZD查询夏令时,例如:

SELECT  
TO_CHAR(TIMESTAMP '2018-02-25 22:22:20+01:00' AT TIME ZONE SESSIONTIMEZONE, 
'yyyy-dd-mm- hh24:mi:ss TZD') AS ts1,
TO_CHAR(TIMESTAMP '2020-04-28 20:20:20+01:00' AT TIME ZONE SESSIONTIMEZONE, 
'yyyy-dd-mm- hh24:mi:ss TZD') AS ts2
FROM DUAL;
TS1                              TS2                                                                        
-------------------------------  --------------------------------------------
2018-25-02- 22:22:20 CET         2020-28-04- 21:20:20 CEST                                                  
1 row selected.

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

最新更新