在检查时间戳转换时,我偶然发现了不同的时区转换。
知道甲骨文从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.
第一次没有夏令时(即冬令时),第二次有夏令时(即夏令时)