【发布时间】:2017-05-04 20:35:45
【问题描述】:
我之前使用过 Oracle 的带时区时间戳,但这次我将值作为字符串获取并尝试将它们加载到数据库中。
在转换字符串时,我最终得到了数据库时区中的值。这很奇怪,但如果它相应地调整了时间,但它没有。见下文:
SELECT TO_CHAR(systimestamp AT TIME ZONE 'Canada/Pacific',
'HH24:MI:SS Mon DD, YYYY TZD') now_pst
, TO_CHAR(systimestamp AT TIME ZONE 'Canada/Eastern',
'HH24:MI:SS Mon DD, YYYY TZD') now_est
FROM DUAL
导致:
now_pst now_est
09:55:50 Dec 19, 2016 PST 12:55:50 Dec 19, 2016 EST
现在使用 to_timestamp_tz:
SELECT '09:55:50 Dec 19, 2016 PST' now_pst
, TO_TIMESTAMP_TZ('09:55:50 Dec 19, 2016 PST', 'HH24:MI:SS Mon DD, YYYY TZD') now_pst_tz
, '12:55:50 Dec 19, 2016 EST' now_est
, TO_TIMESTAMP_TZ('12:55:50 Dec 19, 2016 EST', 'HH24:MI:SS Mon DD, YYYY TZD') now_est_tz
FROM dual
结果:
now_pst now_pst_tz now_est now_est_tz
09:55:50 Dec 19, 2016 PST 19.12.2016 09:55:50.000 -05:00 12:55:50 Dec 19, 2016 EST 19.12.2016 12:55:50.000 -05:00
我应该得到的是: NOW_PST_TZ = 19.12.2016 09:55:50.000 -08:00 (不是 -05:00)
NOW_EST_TZ = 19.12.2016 12:55:50.000 -05:00
我有很多期望在这里没有发生,但主要是这些期望应该是同一时间 - 一个在加拿大/东部,一个在加拿大/太平洋。然而我得到了 2 个不同的时间。
to_timestamp_tz 未能将字符串转换为正确的 TZD。
根据要求:
select sessiontimezone, dbtimezone from dual
结果:
SESSIONTIMEZONE DBTIMEZONE
-05:00 +00:00
【问题讨论】:
-
您能否运行此查询:
select sessiontimezone, dbtimezone from dual;并将其结果附加到问题中? -
@krokodilko,你对
dbtimezone的价值有什么期望? -
@Wernfried Domscheit
systimestamp函数返回数据库所在系统的系统日期以及系统时区。dbtimezone函数返回这个时区(系统时区)。sessiontimezone返回会话的时区。它们可以不同(dbtimezone 和 sessiontimezone)。 -
@krokodilko, no
systimestamp返回数据库服务器操作系统时区的时间,不是dbtimezone,见stackoverflow.com/questions/29271224/…