如何使用Python仅通过年份和月份从SQL查询日期值
解决只凭年月查询数据库日期记录的问题
你的问题核心在于:数据库里的日期字段是完整的YYYY-MM-DD(或带时间)格式,而你直接用f"{year}-{month}"做等于匹配,自然找不到对应记录——没有任何一条记录的日期是YYYY-MM这种格式的。
给你两种可行的解决思路:
思路1:构造月份的日期范围查询
生成目标月份的第一天和下一个月的第一天,查询日期字段在[当月第一天, 下月第一天)区间内的记录,这种方式能利用日期字段的索引,性能更优。
示例代码:
from datetime import datetime year = 2022 month = 6 # 生成当月第一天的日期对象 start_date = datetime(year, month, 1).date() # 生成下月第一天的日期对象 if month == 12: end_date = datetime(year + 1, 1, 1).date() else: end_date = datetime(year, month + 1, 1).date() # 用参数化查询(必须用这种方式,避免SQL注入) # 这里以pymysql为例,其他数据库操作逻辑类似 query = "SELECT * FROM your_table WHERE date_column >= %s AND date_column < %s" cursor.execute(query, (start_date, end_date)) result = cursor.fetchall()
思路2:用数据库内置函数提取年月匹配
直接在SQL里提取日期字段的年和月,和你的变量做匹配。不同数据库的函数语法不同,以下是常见数据库的示例:
MySQL/MariaDB
query = "SELECT * FROM your_table WHERE YEAR(date_column) = %s AND MONTH(date_column) = %s" cursor.execute(query, (year, month)) result = cursor.fetchall()
SQLite
注意月份要补两位(比如6要传"06"):
query = "SELECT * FROM your_table WHERE strftime('%Y', date_column) = %s AND strftime('%m', date_column) = %s" cursor.execute(query, (str(year), f"{month:02d}")) result = cursor.fetchall()
PostgreSQL
query = "SELECT * FROM your_table WHERE EXTRACT(YEAR FROM date_column) = %s AND EXTRACT(MONTH FROM date_column) = %s" cursor.execute(query, (year, month)) result = cursor.fetchall()
⚠️ 重要提醒:无论用哪种方式,都不要直接用字符串拼接生成SQL语句,必须用参数化查询,防止SQL注入风险。
内容的提问来源于stack exchange,提问作者Nicholas Coetzee
相关产品推荐
相关产品推荐

