如何修复Python中SQL查询数据获取函数的类型不匹配问题
修复参数化SQL中日期类型不匹配问题
核心问题是字符串类型的起止日期与datetime64[ns]类型的record_date字段无法直接比较,需要统一两边的类型,以下是两种可靠的修复方案:
方案1:在Python层面转换日期类型
将输入的字符串日期转换为datetime对象后,再传入参数化查询,数据库会自动识别类型并匹配字段:
import pandas as pd from datetime import datetime def get_records(start_date_str, end_date_str): # 根据输入字符串的实际格式调整格式符,比如"%m/%d/%Y"对应MM/DD/YYYY start_date = datetime.strptime(start_date_str, "%Y-%m-%d") end_date = datetime.strptime(end_date_str, "%Y-%m-%d") # 若record_date包含时分秒,建议用>=和<替代BETWEEN,避免漏掉当天晚时段记录 sql_query = """ SELECT * FROM your_table WHERE record_date >= ? AND record_date < ? """ # your_db_connection是你的数据库连接对象(如sqlite3连接、SQLAlchemy引擎等) df = pd.read_sql(sql_query, your_db_connection, params=(start_date, end_date)) return df
如果需要包含end_date当天的所有时分秒记录,可以把end_date调整为次日零点:
end_date = datetime.strptime(end_date_str, "%Y-%m-%d") + pd.Timedelta(days=1)
方案2:在SQL语句中转换字符串日期
根据你使用的数据库类型,用内置函数将字符串日期转换为数据库的datetime类型,再进行比较:
针对SQLite
def get_records(start_date_str, end_date_str): sql_query = """ SELECT * FROM your_table WHERE record_date >= DATETIME(?) AND record_date < DATETIME(?, '+1 day') """ df = pd.read_sql(sql_query, your_db_connection, params=(start_date_str, end_date_str)) return df
针对PostgreSQL
def get_records(start_date_str, end_date_str): sql_query = """ SELECT * FROM your_table WHERE record_date >= TO_DATE(?, 'YYYY-MM-DD') AND record_date < TO_DATE(?, 'YYYY-MM-DD') + INTERVAL '1 day' """ df = pd.read_sql(sql_query, your_db_connection, params=(start_date_str, end_date_str)) return df
针对MySQL
def get_records(start_date_str, end_date_str): sql_query = """ SELECT * FROM your_table WHERE record_date >= STR_TO_DATE(?, '%Y-%m-%d') AND record_date < DATE_ADD(STR_TO_DATE(?, '%Y-%m-%d'), INTERVAL 1 DAY) """ df = pd.read_sql(sql_query, your_db_connection, params=(start_date_str, end_date_str)) return df
关键注意事项
- 始终使用参数化查询(
params传入参数),禁止直接拼接字符串,避免SQL注入风险 - 确保格式符(如
%Y-%m-%d)与输入字符串的日期格式完全匹配,否则会出现转换失败 - 当
record_date包含时分秒时,优先使用>=和<的组合替代BETWEEN,避免遗漏当天晚时段的记录
内容的提问来源于stack exchange,提问作者Moinak Dey
相关产品推荐
相关产品推荐

