具有year = 0问题的Python / Oracle / cx_Oracle日期行为

时间:2016-06-08 20:35:11

标签: python oracle postgresql psycopg2 cx-oracle

我目前正在研究一些ETL代码,以Python作为粘合剂,将数据从源Oracle系统递增加载到Postgresql分析环境。

我正在利用cx_Oracle作为拉取Oracle数据的驱动程序,但我遇到了Oracle Date和Python datetime和0年的一些奇怪问题。

据我了解,Oracle和Python都不支持第0年。我已经用违规日期隔离了特定的行和字段:

SELECT
  CAR_RENTAL_DATE,
  EXTRACT(YEAR FROM CAR_RENTAL_DATE)
FROM
  TRXNS_ALL
WHERE
  TRX_ID = 50079327

以下是sqlplus CLI的结果:

CAR_RENTA EXTRACT(YEARFROMCAR_RENTAL_DATE)
--------- --------------------------------
30-JUN-00                0

根据这篇文章,实际上可以创建一个带有0年级的Oracle日期,但文档中没有正式支持它:in a comment

我遇到的问题是cx_Oracle返回给我的Python表示:

cur.execute('select CAR_RENTAL_DATE, extract(year from CAR_RENTAL_DATE) FROM TRXNS_ALL where TRX_ID = 50079327')
res = cur.fetchone()
print repr(res[0]), type(res[0])

结果如下:

datetime.datetime(0, 6, 30, 0, 0) <type 'datetime.datetime'>

奇怪(但预计),创建相同的Python日期时间会给我一个错误:

dt = datetime.datetime(0, 6, 30, 0, 0)

ValueError: year is out of range

当我尝试使用psycopg2将此日期时间插入Postgresql时间戳字段时,插入失败,正如预期的那样。

这里到底发生了什么?尽管有文档,Oracle和Python如何支持第0年?

除了迭代cx_Oracle返回的每个元组值以检测和处理year = 0之外,处理此问题的好方法是什么?

0 个答案:

没有答案