具有时区 TZR/TZD 处理的 Oracle 时间戳

问题描述 投票:0回答:1

我正在尝试使用

TIMESTAMP WITH TIMEZONE
 将一些字符串解析为 Oracle 的 
to_timestamp_tz

文档建议我应该使用

TZD
来解析三字母代码,例如
PST
PDT
。然而,这似乎不起作用:

SELECT
    to_timestamp_tz('10 Apr 2023 09:09:06 AM UTC', 'DD Mon YYYY HH:MI:SS AM TZD')
FROM
    dual;

ORA-01857: 不是有效的时区

我可以使用

TZR
,根据文档,它应该用于区域信息,如
US/Pacific
:

SELECT
    to_timestamp_tz('10 Apr 2023 09:09:06 AM UTC', 'DD Mon YYYY HH:MI:SS AM TZR')
FROM
    dual;

2023-04-10 09:09:06.000000000 +00:00

TZR
可以处理一些三字母代码,但不能处理其他代码:

SELECT
    to_timestamp_tz('10 Apr 2023 09:09:06 AM PST', 'DD Mon YYYY HH:MI:SS AM TZR')
FROM
    dual;

2023-04-10 09:09:06.0(太平洋标准时间)

SELECT
    to_timestamp_tz('10 Apr 2023 09:09:06 AM PDT', 'DD Mon YYYY HH:MI:SS AM TZR')
FROM
    dual;

ORA-01882: 未找到时区区域

我无法弄清楚为什么其中一些有效而其他无效的原因。

我正在使用

Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production

oracle timestamp-with-timezone
1个回答
0
投票

Oracle 使用时区文件来指定时区和 DST 发生时间的详细信息。

视图

V$TIMEZONE_NAMES
提供有关数据库可用的当前时区信息的详细信息:

例如:

SELECT *
FROM   V$TIMEZONE_NAMES
WHERE  TZABBREV IN ('PST', 'PDT')
FETCH FIRST 10 ROWS ONLY;

可能输出:

TZNAME TZABBREV CON_ID
美国/巴伊亚_班德拉斯 太平洋标准时间 0
美国/博伊西 太平洋标准时间 0
美国/博伊西 PDT 0
美国/克雷斯顿 太平洋标准时间 0
美国/道森 太平洋标准时间 0
美国/道森 PDT 0
美国/Dawson_Creek 太平洋标准时间 0
美国/Dawson_Creek PDT 0
美国/恩塞纳达 太平洋标准时间 0
美国/恩塞纳达 PDT 0

这表明,如果提供最新的时区文件,Oracle 数据库可以支持

PDT
时区。


您可以使用以下方式查找当前时区文件的详细信息:

SELECT * FROM v$timezone_file;

可能会输出:

文件名 版本 CON_ID
timezlrg_35.dat 35 0

您还可以使用以下方式查找版本的详细信息:

SELECT tz_version FROM registry$database;

或:

SELECT property_name, property_value
FROM   database_properties
WHERE  property_name LIKE 'DST_%'
ORDER BY property_name;

可能会输出:

PROPERTY_NAME PROPERTY_VALUE
DST_PRIMARY_TT_VERSION 35
DST_SECONDARY_TT_VERSION 0
DST_UPGRADE_STATE

如果需要,您可以升级数据库时区文件

小提琴

© www.soinside.com 2019 - 2024. All rights reserved.