6

我们的 Oracle 10g 数据库最近升级到 11g。该数据库在 Windows Server 2003 X64 机器上运行。在访问具有 TIMESTAMP (6) WITH TIME ZONE 数据列的表的 .NET 应用程序的 SQL 查询中,我收到以下异常。

System.Data.OracleClient.OracleException:ORA-01805:日期/时间操作中可能出现错误

针对异常的建议操作是确保客户端和服务器版本相同:

ORA-01805:日期/时间操作可能出错原因:客户端和服务器上的时区文件不匹配。操作可能会导致基于本地时区文件的错误结果。行动:请确保客户端和服务器时区版本相同。

我运行了以下查询来检查相关数据库的时区。我还没有找到有关如何为客户端设置时区(或更改时区文件)的信息。

SELECT dbtimezone FROM DUAL;
select * from v$timezone_file;

DBTIMEZONE 
---------- 
+00:00     

FILENAME             VERSION                
-------------------- ---------------------- 
timezlrg_14.dat      14     

我假设客户端指的是我安装的即时客户端,即版本 11_2?我正在通过System.Data.OracleClient.OracleConnection.NET Framework 提供的 a 运行查询。UI 假设“时区版本”指的是时区文件版本。我看不到即时客户端在哪里有时区文件。任何建议都可以接受。

4

4 回答 4

4

我确定我安装了版本 11_2_0_1 的即时客户端。升级到 11_2_0_2 似乎缓解了这个问题。但是,我仍然不清楚即时客户端如何管理它的时区文件,甚至它在哪里或它是什么。我读过的所有资料都说要确保客户端和服务器具有相同的时区文件版本,但我不清楚这实际上是如何在客户端上完成的。除了使用不同版本的即时客户端之外,也许它不是我可以直接维护的东西?

于 2011-10-07T13:00:56.930 回答
3

使用“genezi -v”了解时区文件版本。

这是我的 Linux 机器中的一个示例:

$ genezi -v
Client Shared Library 32-bit - 11.2.0.2.0

System name:    Linux
Release:    2.6.32-34-generic
Version:    #77-Ubuntu SMP Tue Sep 13 19:39:17 UTC 2011
Machine:    x86_64

Operating in Instant Client mode.
Small timezone file = timezone_14.dat
Large timezone file = timezlrg_14.dat
于 2011-10-08T16:10:42.707 回答
1

除其他原因外,当您进行时区转换并使用版本比数据库高得多的 cx-Oracle 库时,使用 python3.6 也会出现问题。

它解释了“Manuel Pinot”的评论。只要他评论 TZ 转换线,它就起作用了。

我在使用最新的 cx-Oracle 8.1.0 时遇到了与 python 3.6 相同的问题,但连接到旧数据库 12.1。

  • 使用的python:python3.6
  • 安装了最新的 cx-Oracle 版本 8.1.0(通常用于 18-19.x 左右的版本)
  • 连接的数据库:12.1.0.2
  • Oracle 即时客户端 12.2

调用没有时区转换的查询可以正常工作:

sql='''select cast (sysdate AS TIMESTAMP WITH TIME ZONE) from dual'''
cur.execute(sql)
cur.fetchone()
(datetime.datetime(2020, 12, 28, 17, 7, 52),)

使用时区转换调用类似查询失败:

sql='''select cast (sysdate AS TIMESTAMP WITH TIME ZONE) AT TIME ZONE 'UTC' from dual'''
cur.execute(sql)
cur.fetchone()
*** cx_Oracle.DatabaseError: ORA-01805: possible error in date/time operation

我的解决方案:降级到较旧的 cx-Oracle 客户端(Oracle-instant 客户端 12.2 保持不变)

pip install -U cx-Oracle==6.4.1
Collecting cx-Oracle==6.4.1
  Using cached cx_Oracle-6.4.1-cp36-cp36m-manylinux1_x86_64.whl (596 kB)
    Installing collected packages: cx-Oracle
  Attempting uninstall: cx-Oracle
    Found existing installation: cx-Oracle 8.1.0
    Uninstalling cx-Oracle-8.1.0:
      Successfully uninstalled cx-Oracle-8.1.0
Successfully installed cx-Oracle-6.4.1

现在再次使用时区转换进行测试:

sql='''select cast (sysdate AS TIMESTAMP WITH TIME ZONE) AT TIME ZONE 'UTC' from dual'''
cur.execute(sql)
cur.fetchone()
(datetime.datetime(2020, 12, 28, 17, 20, 54),)
于 2020-12-28T16:22:03.237 回答
0

我在使用 Docker 的 Oracle 11G 中遇到与 ORA-01505 相同的问题

ActiveRecord::StatementInvalid (OCIError: ORA-01805: possible error in date/time operation: SELECT  "USERS".* FROM "USERS" WHERE "USERS"."EMAIL" = :a1 ORDER BY "USERS"."ID" ASC FETCH FIRST :a2 ROWS ONLY):

我在 docker-compose.yml 中使用

    environment:
      - TZ=America/Guatemala

所以只要评论这条线,一切都会奏效

      environment:
      #- TZ=America/Guatemala
于 2019-08-01T19:43:33.983 回答