Python/Oracle/cx_年=0问题的Oracle日期行为
我目前正在编写一些ETL代码,以将数据从源Oracle系统增量加载到以Python为粘合剂的Postgresql分析环境 我正在利用cx_Oracle作为驱动程序来提取Oracle数据,但我在Oracle Date和Python datetime以及0年方面遇到了一些奇怪的问题 据我所知,Oracle和Python都不支持0年。我隔离了一个日期不合适的特定行和字段:Python/Oracle/cx_年=0问题的Oracle日期行为,python,oracle,postgresql,psycopg2,cx-oracle,Python,Oracle,Postgresql,Psycopg2,Cx Oracle,我目前正在编写一些ETL代码,以将数据从源Oracle系统增量加载到以Python为粘合剂的Postgresql分析环境 我正在利用cx_Oracle作为驱动程序来提取Oracle数据,但我在Oracle Date和Python datetime以及0年方面遇到了一些奇怪的问题 据我所知,Oracle和Python都不支持0年。我隔离了一个日期不合适的特定行和字段: SELECT CAR_RENTAL_DATE, EXTRACT(YEAR FROM CAR_RENTAL_DATE) FR
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日期,但文档中不支持该日期:
我遇到的问题是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'>
当我尝试使用psycopg2将此datetime插入到Postgresql时间戳字段时,正如预期的那样,插入失败
这到底是怎么回事?Oracle和Python如何支持第0年(尽管有文档记录)
除了迭代cx\U Oracle返回的每个元组值以检测和处理year=0之外,还有什么好的方法来处理这个问题呢?关于为什么cx\U Oracle能够创建时髦的日期时间:。如果
选择DUMP(CAR\u RENTAL\u DATE),你会得到什么从TRXNS_ALL,其中TRX_ID=50079327
?@IljaEveriläsense@IljaEverilä您可以使用纯SQL创建日期:从DUAL
@MT0中选择日期“0000-06-30”。这是输出Typ=12 Len=7:100100,6,30,1,1
dt = datetime.datetime(0, 6, 30, 0, 0)
ValueError: year is out of range