cx_oracle возвращает экземпляры datetime
для столбцов типов TIMESTAMP
или TIMESTAMP WITH TIME ZONE
, но эти экземпляры datetime не осведомлены о часовом поясе.
Например:
SELECT column_name, data_type FROM ALL_TAB_COLUMNS WHERE table_name = 'mytable';
column_name data_type
----------- ---------------------------
MYCOL TIMESTAMP(6) WITH TIME ZONE
Как вы можете видеть, MYCOL - это TIMESTAMP, который осведомлен о часовом поясе. Я ожидал бы, что следующее вернет объект datetime Python, содержащий данные tzinfo. Однако:
>>> cxoracle_cursor.execute("select mycol from mytable")
>>> row = cx_oracle_cursor.fetchone()
>>> row['mycol']
datetime.datetime(2011, 6, 15, 8, 30)
Этот объект datetime не информирован о часовом поясе, поэтому я не могу надежно использовать эту дату в своем приложении.
Каков наилучший подход к извлечению этого столбца в качестве объекта datetime, который известен в часовом поясе?
Здесь Я вижу следующее: Для данных TIMESTAMP WITH TIME ZONE значение datetime всегда находится в UTC, поэтому преобразование не требуется.
Итак, если вы не заметили часовой пояс объекта datetime
, я понимаю, что он находится в UTC. Итак, вы можете сделать:
dt = pytz.utc.localize(row['mycol'])
Или попробуйте функцию SYS_EXTRACT_UTC
(Извлекает UTC из даты и времени с смещением часового пояса), а затем с помощью pytz.utc.localize
.
cx_Oracle
:cx_Oracle
просто возвращает объектdatetime
который является простым неcx_Oracle
от часового пояса усечениемTIMESTAMP WITH TIME ZONE
.