Oracle 19c中to_timestamp_tz的TZR/TZD时区解析异常问题
Oracle 19c to_timestamp_tz函数解析时区的问题分析与解决
问题原因解析
1. TZD格式的适用范围限制
TZD是用于标识地区时区的夏令时/标准时状态(比如PST是US/Pacific的标准时,PDT是其夏令时),它不是独立的时区标识,必须依附于某个有夏令时切换的地区时区。UTC属于无夏令时的时区,不存在对应的TZD后缀,因此用TZD格式解析UTC字符串时,Oracle会判定为无效时区,抛出ORA-01857错误。
2. TZR格式的合法值要求
TZR对应的是完整的时区区域名(如US/Pacific、UTC),Oracle的时区数据库中并没有将PDT列为合法的区域名——PDT只是US/Pacific时区在夏令时期间的状态标识,而非独立时区。而PST能被TZR解析,是因为Oracle将其作为US/Pacific标准时的别名收录,因此用TZR解析PDT会抛出ORA-01882错误(时区区域未找到)。
解决方案
解析UTC字符串
直接使用TZR格式,因为UTC是合法的时区区域名:
SELECT TO_TIMESTAMP_TZ('2024-05-20 10:00:00 UTC', 'YYYY-MM-DD HH24:MI:SS TZR') FROM DUAL;
解析PST/PDT字符串
方法1:使用TZD格式(推荐)
PDT/PST作为夏令时/标准时状态标识,用TZD格式可以正常解析,Oracle会自动关联到对应的地区时区(默认是US/Pacific):
-- 解析PDT SELECT TO_TIMESTAMP_TZ('2024-05-20 10:00:00 PDT', 'YYYY-MM-DD HH24:MI:SS TZD') FROM DUAL; -- 解析PST SELECT TO_TIMESTAMP_TZ('2024-11-20 10:00:00 PST', 'YYYY-MM-DD HH24:MI:SS TZD') FROM DUAL;
方法2:结合TZR和TZD(更严谨)
如果需要明确指定时区区域,避免歧义,可以同时使用TZR和TZD格式:
SELECT TO_TIMESTAMP_TZ('2024-05-20 10:00:00 US/Pacific PDT', 'YYYY-MM-DD HH24:MI:SS TZR TZD') FROM DUAL;
方法3:手动指定时区偏移
如果知道PDT对应的UTC偏移(UTC-7),也可以用FROM_TZ函数转换:
SELECT FROM_TZ(TO_TIMESTAMP('2024-05-20 10:00:00', 'YYYY-MM-DD HH24:MI:SS'), '-07:00') FROM DUAL;
内容的提问来源于stack exchange,提问作者Tianxiang Xiong
相关产品推荐
相关产品推荐

