Получение метки времени Oracle с использованием модуля Python Win32 ODBC

StackOverflow https://stackoverflow.com/questions/38435

  •  09-06-2019
  •  | 
  •  

Вопрос

Учитывая таблицу 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) не будет работать.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top