Python datetime64[ns]写入Oracle TIMESTAMP(3)列时毫秒丢失问题求助
解决PyOdbc更新Oracle TIMESTAMP(3) WITH LOCAL TIME ZONE时毫秒丢失的问题
核心原因
PyOdbc默认处理datetime64[ns]类型时,可能截断毫秒信息,或所用ODBC驱动未正确识别带毫秒的时间戳参数,导致写入Oracle时丢失毫秒位。
解决方法
1. 使用参数化查询+原生Python datetime对象
将DataFrame中的datetime64[ns]类型转换为Python原生datetime对象,通过参数化查询传递,确保PyOdbc驱动正确解析毫秒信息:
import pandas as pd import pyodbc # 转换pandas时间列为原生datetime类型 df['MOVE_OUT_TIME'] = df['MOVE_OUT_TIME'].dt.to_pydatetime() # 建立数据库连接并执行更新 conn_str = "DRIVER={Oracle ODBC Driver};DBQ=你的数据库实例;UID=用户名;PWD=密码" conn = pyodbc.connect(conn_str) cursor = conn.cursor() update_sql = "UPDATE your_table SET move_out_time = ? WHERE your_id_column = ?" for _, row in df.iterrows(): cursor.execute(update_sql, row['MOVE_OUT_TIME'], row['your_id_column']) conn.commit() cursor.close() conn.close()
2. 更换为Oracle官方ODBC驱动
部分第三方ODBC驱动对Oracle TIMESTAMP类型的毫秒支持不完善,建议使用Oracle Instant Client ODBC驱动,它能完整保留时间戳的毫秒精度,避免截断问题。
3. 通过TO_TIMESTAMP函数传入格式化字符串
如果参数化查询仍有问题,可将时间格式化为带三位毫秒的字符串,通过Oracle的TO_TIMESTAMP函数转换后写入:
update_sql = """ UPDATE your_table SET move_out_time = TO_TIMESTAMP(?, 'YYYY-MM-DD HH24:MI:SS.FF3') WHERE your_id_column = ? """ for _, row in df.iterrows(): # 格式化时间为保留三位毫秒的字符串 time_str = row['MOVE_OUT_TIME'].strftime('%Y-%m-%d %H:%M:%S.%f')[:-3] cursor.execute(update_sql, time_str, row['your_id_column'])
内容的提问来源于stack exchange,提问作者Itamar Wolf
相关产品推荐
相关产品推荐

