Python基于今日与3个月前日期条件更新SQL表遇类型错误求助
问题分析与解决
首先,你遇到的TypeError核心原因是你在拿datetime对象和pyodbc.Row对象做比较。你的fetch_date()函数返回的是包含sent_date和id的完整数据库行对象,而非单独的日期值,这直接导致了类型不兼容的错误。
除此之外,代码还有两个关键逻辑漏洞:
fetch_date()里的循环只执行一次就return,只会返回第一行数据,完全没法遍历所有需要判断的记录;- 你的
UPDATE语句没有WHERE条件,一旦执行会把整张表的所有行都更新,这显然违背了你只想修改特定日期范围行的初衷。
推荐方案:直接用SQL完成(更高效简洁)
其实完全不需要把数据拉到Python里做判断,直接用SQL语句就能实现需求,性能更好还能避免类型转换的麻烦:
UPDATE Department.Customer SET name = NULL, address = NULL, email = NULL, phone = NULL WHERE sent_date BETWEEN DATEADD(month, -3, GETDATE()) AND GETDATE()
对应Python执行代码:
import pyodbc conn = pyodbc.connect( r'DRIVER={SQL Server};' r'SERVER=server;' r'DATABASE=db;' ) try: cursor = conn.cursor() # 执行带条件的更新语句 cursor.execute(""" UPDATE Department.Customer SET name = NULL, address = NULL, email = NULL, phone = NULL WHERE sent_date BETWEEN DATEADD(month, -3, GETDATE()) AND GETDATE() """) conn.commit() print(f"成功更新 {cursor.rowcount} 行数据") except pyodbc.Error as ex: print(f"执行出错: {str(ex)}") conn.rollback() finally: cursor.close() conn.close()
如果一定要用Python处理日期判断
如果你需要在Python里做额外逻辑处理,可按以下方式修正代码,确保拿到正确的日期值,并针对符合条件的行精准更新:
import pyodbc from datetime import datetime import dateutil.relativedelta conn = pyodbc.connect( r'DRIVER={SQL Server};' r'SERVER=server;' r'DATABASE=db;' ) dt = datetime.today() dr3 = dt - dateutil.relativedelta.relativedelta(months=3) try: cursor = conn.cursor() # 获取所有需要判断的记录(日期和ID) cursor.execute("SELECT sent_date, id FROM Department.Customer") rows = cursor.fetchall() for row in rows: sent_date = row[0] # 取出单独的日期字段 customer_id = row[1] # 修正判断逻辑:原代码的日期范围写反了,正确应为3个月前到今日之间 if dr3 < sent_date < dt: # 用ID定位要更新的行,避免全表更新 cursor.execute(""" UPDATE Department.Customer SET name=?, address=?, email=?, phone=? WHERE id=? """, (None, None, None, None, customer_id)) conn.commit() print(f"成功更新 {cursor.rowcount} 行数据") except pyodbc.Error as ex: print(f"执行出错: {str(ex)}") conn.rollback() finally: cursor.close() conn.close()
注意:原代码里的dt < date_sql < dr3逻辑是错误的,因为dr3是3个月前的日期,数值上比dt小,正确的范围判断应该是dr3 < sent_date < dt。
内容的提问来源于stack exchange,提问作者Niknak
相关产品推荐
相关产品推荐

