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

如何使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 21:24:22