SQLAlchemy:如何过滤日期字段?

159 投票
4 回答
189854 浏览
提问于 2025-04-17 10:26

这里是模型:

class User(Base):
    ...
    birthday = Column(Date, index=True)   #in database it's like '1987-01-17'
    ...

我想要筛选两个日期之间的数据,比如选择年龄在18到30岁之间的所有用户。

我该如何用SQLAlchemy来实现这个功能呢?

我想到的办法是:

query = DBSession.query(User).filter(
    and_(User.birthday >= '1988-01-17', User.birthday <= '1985-01-17')
) 

# means age >= 24 and age <= 27

我知道这样做是不对的,但我该怎么做才是正确的呢?

4 个回答

7
from app import SQLAlchemyDB as db

Chance.query.filter(Chance.repo_id==repo_id, 
                    Chance.status=="1", 
                    db.func.date(Chance.apply_time)<=end, 
                    db.func.date(Chance.apply_time)>=start).count()

这等于:

select
   count(id)
from
   Chance
where
   repo_id=:repo_id 
   and status='1'
   and date(apple_time) <= end
   and date(apple_time) >= start

希望这能帮到你。

13

如果你想获取整个时间段:

    from sqlalchemy import and_, func

    query = DBSession.query(User).filter(and_(func.date(User.birthday) >= '1985-01-17'),\
                                              func.date(User.birthday) <= '1988-01-17'))

这意味着时间范围是:1985年1月17日 00:00 - 1988年1月17日 23:59

263

其实,你的问题基本上是对的,只是有个小错误:你的筛选条件把所有记录都排除了。你应该把 <= 改成 >=,反之亦然:

qry = DBSession.query(User).filter(
        and_(User.birthday <= '1988-01-17', User.birthday >= '1985-01-17'))
# or same:
qry = DBSession.query(User).filter(User.birthday <= '1988-01-17').\
        filter(User.birthday >= '1985-01-17')

另外,你也可以使用 between 来进行筛选:

qry = DBSession.query(User).filter(User.birthday.between('1985-01-17', '1988-01-17'))

撰写回答