如何将Python Timestamp列表转为日期格式传入SQL查询WHERE子句
解决Timestamp列表转SQL日期字符串的问题
你遇到的核心问题有两个:一是tolist()得到的是Python的Timestamp对象,直接用repr()输出的格式SQL无法识别;二是想用多个日期匹配时,应该用IN而不是=(用=只会匹配单个值,多个值会导致语法错误)。下面是具体的解决步骤:
1. 先把Timestamp转换为标准日期字符串列表
首先要把DataFrame里的Timestamp类型日期转成SQL能识别的'YYYY-MM-DD'格式字符串,再生成列表:
# 使用dt.strftime将Timestamp转为指定格式的字符串,再转成列表 begdtlist = df["BEG_DT"].dt.strftime('%Y-%m-%d').tolist()
执行后begdtlist会变成:
['2018-04-29', '2018-04-22', '2018-04-22', '2018-04-29', '2018-04-29']
2. 正确构建SQL的IN查询语句
接下来把列表转成SQLIN子句需要的带单引号的格式,再拼接到SQL中:
# 把列表元素用单引号包裹,并用逗号分隔 date_clause = ','.join(f"'{date}'" for date in begdtlist) # 拼接完整SQL语句 sql = f"select calndr_dt,wk_of_mnth from DatabaseName where calndr_dt IN ({date_clause})"
最终生成的SQL语句会是:
select calndr_dt,wk_of_mnth from DatabaseName where calndr_dt IN ('2018-04-29','2018-04-22','2018-04-22','2018-04-29','2018-04-29')
补充说明
- 如果你的
BEG_DT列已经是字符串格式的日期,直接用df["BEG_DT"].tolist()即可,不需要dt.strftime转换。 - 尽量避免直接用字符串拼接SQL语句(存在SQL注入风险),如果你的数据库连接库支持参数化查询(比如
pandas.read_sql的params参数、psycopg2的参数绑定),优先使用参数化方式传入列表,比如:import pandas as pd from sqlalchemy import create_engine engine = create_engine('your_database_connection_string') sql = "select calndr_dt,wk_of_mnth from DatabaseName where calndr_dt IN %(dates)s" df_result = pd.read_sql(sql, engine, params={'dates': begdtlist})
内容的提问来源于stack exchange,提问作者jorge
相关产品推荐
相关产品推荐

