我正在尝试使用
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 使用时区文件来指定时区和 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 | 无 |
如果需要,您可以升级数据库时区文件。