SQLAlchemy:如何过滤日期字段?

时间:2012-01-17 13:14:49

标签: python sql database orm sqlalchemy

这是模特:

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

我知道这不正确,但如何做正确?

提前致谢!

3 个答案:

答案 0 :(得分:145)

事实上,除了拼写错误之外,您的查询是正确的:您的过滤器排除了所有记录:您应该更改<=的{​​{1}},反之亦然:

>=

您也可以使用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

答案 1 :(得分:1)

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
希望可以帮到你。

答案 2 :(得分:0)

如果要获得整个期限:

    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-01-17 00:00 - 1988-01-17 23:59