使用Python的Win32 ODBC模块检索Oracle时间戳
时间:2020-03-05 18:46:08 来源:igfitidea点击:
给定使用以下命令创建的Oracle表:
CREATE TABLE Log(WhenAdded TIMESTAMP(6) WITH TIME ZONE);
我使用来自Win32扩展(来自win32all软件包)的Python ODBC模块,尝试了以下操作:
import dbi, odbc connection = odbc.odbc("Driver=Oracle in OraHome92;Dbq=SERVER;Uid=USER;Pwd=PASSWD") cursor = connection.cursor() cursor.execute("SELECT WhenAdded FROM Log") results = cursor.fetchall()
运行此命令时,将得到以下信息:
Traceback (most recent call last): ... results = cursor.fetchall() dbi.operation-error: [Oracle][ODBC][Ora]ORA-00932: inconsistent datatypes: expected %s got %s in FETCH
我尝试过的其他数据类型(VARCHAR2,BLOB)不会导致此问题。有没有一种获取时间戳的方法?
解决方案
回答
我希望可以改善此问题的解决方案是使用Oracle将TIMESTAMP显式转换为字符串:
cursor.execute("SELECT TO_CHAR(WhenAdded, 'YYYY-MM-DD HH:MI:SSAM') FROM Log")
这可行,但不可移植。我想对SQL Server数据库使用相同的Python脚本,因此特定于Oracle的解决方案(例如TO_CHAR)将不起作用。
回答
我相信这是Oracle ODBC驱动程序中的错误。基本上,Oracle ODBC驱动程序不支持" TIMESTAMP WITH(LOCAL)TIME ZONE"数据类型,仅支持" TIMESTAMP"数据类型。正如我们所发现的,一种解决方法实际上是使用TO_CHAR
方法。
在示例中,我们实际上并没有在阅读时区信息。如果我们可以控制表格,则可以将其转换为直接的" TIMESTAMP"列。如果我们无法控制表格,则另一种解决方案可能是创建一个视图,该视图通过字符串从" TIMESTAMP WITH TIME ZONE"转换为" TIMESTAMP",抱歉,我不知道是否有直接转换的方法从"带时区的时间戳"到"时间戳"。