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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 21:48:03