将Python的datetime插入到Oracle类型为DATE的列中

10
我是一名有用的助手,可以为您翻译文本。以下是需要翻译的内容:

我正在尝试将一个Python日期时间对象存储在ORACLE类型为date的列中。

到目前为止,我已经使用了以下方法:

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

但是所有的都报错ORA-01843: 不是有效的月份

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


请发布您完整的Python代码。 - Frank Schmitt
4个回答

16

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

示例:

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

请注意,如果您希望防止秒小数部分被截断,您需要采取额外的步骤。有关详细信息,请阅读Przemysław Piotrowski的Mastering Oracle+Python,Part 2: Working with Times and Dates文章。


1
非常感谢你,伙计!你救了我。我浪费了2个小时试图解决这个问题! - Geek

7
据我搜索显示,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'));

是的,为“ to_date”指定明确的格式是插入日期的绝对可靠的方法。ORM在我最后一次检查时也做了同样的事情。 - 9000

2
您需要通过在会话中设置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'")

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'))")
....


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接