如何在SQLite中跨多年查询指定日期范围记录(含Peewee实现)
解决方案:SQLite跨年份日期范围查询(Peewee实现)
核心思路
要获取所有年份中符合指定月日范围的记录,关键是剥离日期的年份部分,只比较月日是否落在目标区间内。需要区分两种场景:
- 目标区间不跨年(如2月1日-2月2日):直接判断月日在区间内
- 目标区间跨年(如1月31日-2月2日):判断月日大于等于起始日,或者小于等于结束日
SQLite原生SQL实现
假设表名为data_table,日期列名为record_date,目标起始月日为'01-31',结束月日为'02-02',SQL语句如下:
SELECT record_date, value FROM data_table WHERE CASE WHEN '01-31' <= '02-02' THEN strftime('%m-%d', record_date) BETWEEN '01-31' AND '02-02' ELSE strftime('%m-%d', record_date) >= '01-31' OR strftime('%m-%d', record_date) <= '02-02' END ORDER BY record_date DESC;
关键说明
strftime('%m-%d', record_date):提取日期的月日部分,格式为MM-DD,确保字符串比较符合日期逻辑CASE语句:根据目标区间是否跨年,切换判断条件ORDER BY record_date DESC:按日期倒序排列,匹配示例中的输出顺序
Peewee ORM实现
首先定义模型:
from peewee import SqliteDatabase, Model, DateTimeField, FloatField # 初始化数据库连接 db = SqliteDatabase('your_database.db') # 定义数据表模型 class DataTable(Model): record_date = DateTimeField() # 对应SQLite的datetime类型 value = FloatField() # 实数列 class Meta: database = db table_name = 'data_table' # 对应数据库表名
然后实现查询函数:
from peewee import fn def query_records_by_month_day(start_md, end_md): # 提取日期的月日部分(调用SQLite的strftime函数) month_day = fn.strftime('%m-%d', DataTable.record_date) # 根据区间是否跨年构建查询条件 if start_md <= end_md: condition = month_day.between(start_md, end_md) else: condition = (month_day >= start_md) | (month_day <= end_md) # 执行查询并按日期倒序返回 return DataTable.select().where(condition).order_by(DataTable.record_date.desc()) # 示例调用 if __name__ == '__main__': # 查询1月31日到2月2日的所有年份记录 results = query_records_by_month_day('01-31', '02-02') for row in results: print(row.record_date.strftime('%Y-%m-%d'))
关键说明
fn.strftime:Peewee中调用SQLite内置函数的方式,用于提取月日- 条件判断:在Python层先判断起始/结束月日的大小,生成对应的查询条件,避免在SQL中写复杂逻辑
- 排序:通过
order_by(DataTable.record_date.desc())实现倒序排列,和示例输出一致
内容的提问来源于stack exchange,提问作者B4dmonkey
相关产品推荐
相关产品推荐

