我们的Oracle 10g数据库最近升级到11g。该数据库在Windows Server 2003 X64计算机上运行。在来自访问具有TIMESTAMP(6)WITH TIME ZONE数据列的表的.NET应用程序的SQL查询中,我收到以下异常。
System.Data.OracleClient.OracleException:ORA-01805:日期/时间操作中可能出错
例外suggested action是为了确保客户端和服务器版本相同:
ORA-01805:日期/时间操作可能出错 原因:客户端和服务器上的时区文件不匹配。操作可能会导致基于本地时区文件的错误结果。 操作:请确保客户端和服务器时区版本相同。
我运行了以下查询来检查相关数据库的时区。我没有找到有关如何为客户端设置时区(或更改时区文件)的信息。
SELECT dbtimezone FROM DUAL;
select * from v$timezone_file;
DBTIMEZONE
----------
+00:00
FILENAME VERSION
-------------------- ----------------------
timezlrg_14.dat 14
我假设客户端指的是我安装的Instant Client,版本是11_2?我正在通过.NET Framework提供的System.Data.OracleClient.OracleConnection
运行查询。我假设“timezone version”它指的是时区文件版本。我没看到即时客户端有时区文件。任何建议都是适用的。
答案 0 :(得分:4)
我确定我安装了即时客户端版本11_2_0_1。升级到11_2_0_2似乎已经解除了这个问题。但是,我仍然不清楚即时客户端如何管理时区文件,甚至是它的位置或内容。我读过的所有资源都说确保客户端和服务器具有相同的时区文件版本,但我不清楚它是如何在客户端上实际完成的。也许除了使用不同版本的即时客户端之外,我不能直接维护它?
答案 1 :(得分: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
答案 2 :(得分:1)
除其他原因外,当您进行时区转换并使用版本比数据库高得多的 cx-Oracle 库时,使用 python3.6 也会出现问题。
它解释了“Manuel Pinot”的评论。只要他评论 TZ 转换行,它就起作用了。
我在使用最新的 cx-Oracle 8.1.0 的 python 3.6 上遇到了同样的问题,但连接到旧数据库 12.1。
在没有时区转换的情况下调用查询工作正常:
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),)
答案 3 :(得分: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