我正在尝试将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对象
答案 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)
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