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

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

157519 次浏览

事实上,除了输入错误,您的查询是正确的: 您的过滤器排除了所有记录: 您应该更改 >=<=,反之亦然:

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

愿望可以帮助你。

如果你想得到 完整周期:

    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日 0点钟方向-1988-01-17 23:59

下面是一个使用最新的 Flask版本并使用 flask-marshmallow的版本。

from datetime import date, timedelta


from flask import jsonify


from app import db, ma
from app.models import User


from . import main


class UserSchema(ma.Schema):
class Meta:
fields = ('forename', 'surname', 'birthday', ...)




@main.route('/', methods=('GET',))
def get_users():


start_range = date.today() + timedelta(years=-30)
end_range = date.today() + timedelta(years=-18)


users = db.session.query(User).filter(User.birthday.between(start_range, end_range)).all()


users_schema = UserSchema(many=True)


return jsonify(users_schema.dump(users))