web-dev-qa-db-ja.com

SQLAlchemy:日付フィールドをフィルタリングする方法は?

モデルは次のとおりです。

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

たとえば、18〜30年の間隔ですべてのユーザーを選択するために、2つの日付の間をフィルター処理したい。

SQLAlchemyで実装する方法は?

私は考える:

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

# means age >= 24 and age <= 27

私はこれが正しくないことを知っていますが、どのように修正するのですか?

86
Vitalii Ponomar

実際、入力ミスを除いてクエリは正しいです。フィルタはすべてのレコードを除外しています。<= ために >= およびその逆:

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'))
153
van
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

希望があなたを助けることができます。

1
atool

whole期間を取得する場合:

    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:-1988-01 -1723:59

0
MrNinjamannn