使用Flask-SQLAlchemy过滤当日数据 将YYYY-MM-DD-HH:MM:SS转为日期格式
SQLAlchemy 筛选当日带时分秒时间字段最优方案
你的现有写法逻辑可满足需求:通过func.date()将数据库中带时分秒的created_at字段转换为纯日期类型,和date.today()比对时自动忽略时分秒差异,但存在性能缺陷:如果created_at字段建有索引,使用函数包裹字段后会导致索引失效,数据量较大时查询效率很低。
无需处理格式差异、同时性能最优的方案是时间范围查询,无需对数据库字段做任何函数转换,直接筛选created_at落在当日0点到次日0点的区间内即可:
from sqlalchemy import func from datetime import datetime, timedelta # 导入你模型定义中使用的时区对象 from models import tz def attempt_count(user_id): # 生成当前时区的当日起始、次日起始时间 today_start = datetime.now(tz=tz).replace(hour=0, minute=0, second=0, microsecond=0) tomorrow_start = today_start + timedelta(days=1) # 直接调用count方法无需查询全量数据,进一步提升性能 number = db_session.query(RecoveryToken)\ .filter(RecoveryToken.user_id == user_id)\ .filter(RecoveryToken.created_at >= today_start)\ .filter(RecoveryToken.created_at < tomorrow_start)\ .count() print('todays records', number) return number
该方案的优势:
- 自动忽略时分秒差异,统计逻辑和日期转换方案完全一致
- 不对
created_at字段做函数处理,字段有索引时可直接命中,查询性能远高于日期转换写法 - 适配字段自带的时区设置,不会出现时区偏差导致的日期统计错误
- 直接调用ORM的
count()方法无需拉取全量记录,避免内存浪费
内容的提问来源于stack exchange,提问作者Aldo Matus
相关产品推荐
相关产品推荐

