Получение метки времени Oracle с использованием модуля Python Win32 ODBC
Вопрос
Учитывая таблицу Oracle, созданную с использованием следующего:
CREATE TABLE Log(WhenAdded TIMESTAMP(6) WITH TIME ZONE);
Использование модуля Python ODBC из его расширений Win32 (из пакета win32all), Я попробовал следующее:
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 ODBC. По сути, драйвер Oracle ODBC не поддерживает типы данных TIMESTAMP WITH (LOCAL) TIME ZONE
, только тип данных TIMESTAMP
. Как вы обнаружили, одним из способов решения этой проблемы является использование метода TO_CHAR
.
В вашем примере вы на самом деле не читаете информацию о часовом поясе. Если у вас есть контроль над таблицей, вы можете преобразовать ее в прямой столбец TIMESTAMP
. Если у вас нет контроля над таблицей, другим решением может быть создание представления, которое преобразует из строки TIMESTAMP WITH TIME ZONE
в TIMESTAMP
через строку - извините, я не понимаю не знаю, есть ли способ напрямую преобразовать TIMESTAMP WITH TIME ZONE
в TIMESTAMP
.
Другие советы
Мое решение этого, которое, я надеюсь, может быть улучшено, состоит в том, чтобы использовать Oracle для явного преобразования TIMESTAMP в строку:
cursor.execute("SELECT TO_CHAR(WhenAdded, 'YYYY-MM-DD HH:MI:SSAM') FROM Log")
Это работает, но не переносимо. Я хотел бы использовать тот же сценарий Python для базы данных SQL Server, поэтому решение Oracle (например, TO_CHAR) не будет работать.