You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 21:12:26