将Python datetime插入DATE类型的Oracle列

时间:2014-05-12 14:52:55

标签: python oracle date cx-oracle

我正在尝试将python datetime对象存储到date类型的ORACLE列。

到目前为止,我已经使用了

rpt_time = time.strftime('%Y-%m-%d %H:%M:%S') or
rpt_time = str(datetime.datetime.now())

但是所有人都在给ORA-01843:不是有效的montn

我真的很困惑如何插入ORACLE日期类型python datetime对象

5 个答案:

答案 0 :(得分:5)

就我的搜索显示,ORACLE在日期上可能很挑剔,所以这可能是你需要做的。

首先,检查您拥有的日期格式。例如,如果您有类似于2010/01/26:11:00:00AM的内容,那么您可能希望在光标执行时执行以下操作:

insert into x
values(99, to_date('2010/01/26:11:00:00AM', 'yyyy/mm/dd:hh:mi:ssam'));

答案 1 :(得分:5)

cx_Oracle支持传递类datetime.datetime的对象。因为当你已经拥有这个类的对象时(例如在调用datetime.datetime.now()时),你不应该尝试格式化它并作为字符串传递,而是直接传递它。这样可以防止因日期和/或时间格式错误而导致的所有错误。

示例:

cursor.execute("INSERT INTO SomeTable VALUES(:now)", {'now': datetime.datetime.now()})

请注意,如果要防止截断小数部分秒,则必须执行其他步骤。有关详细信息,请阅读PrzemysławPiotrowski的Mastering Oracle+Python, Part 2: Working with Times and Dates文章。

答案 2 :(得分:0)

您必须通过在会话中设置nls_date_format将日期从python转换为oracle

>>> rpt_time = time.strftime('%Y-%m-%d %H:%M:%S')
>>> rpt_time
'2014-05-12 21:06:40'

然后在插入oracle之前,请执行以下操作

cursor.execute("ALTER SESSION SET NLS_DATE_FORMAT = 'YYYY-MM-DD HH24:MI:SS'")

答案 3 :(得分:0)

python中的

datetime.now()提供了毫秒,必须先删除它,然后才能成功写入Oracle。

from datetime import datetime
....
cursor.execute("INSERT INTO myTable VALUES(to_date('" + str(datetime.now().replace(microsecond=0)) + "','yyyy-mm-dd hh24:mi:ss'))")
....

答案 4 :(得分:-4)

您需要导入日期时间库以使用日期时间函数

from datetime import datetime