SQLAlchemy: how to filter date field?


Here is model:

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

I want to filter between two dates, for example to choose all users in interval 18-30 years.

How to implement it with SQLAlchemy?

I think of:

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

# means age >= 24 and age <= 27

I know this is not correct, but how to do correct?

Asked By: Vitalii Ponomar



In fact, your query is right except for the typo: your filter is excluding all records: you should change the <= for >= and vice versa:

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

Also you can use between:

qry = DBSession.query(User).filter(User.birthday.between('1985-01-17', '1988-01-17'))
Answered By: van
from app import SQLAlchemyDB as db


it is equal to:

   and status='1'
   and date(apple_time) <= end
   and date(apple_time) >= start

wish can help you.

Answered By: atool

if you want to get the whole period:

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

That means range: 1985-01-17 00:001988-01-17 23:59

Answered By: MrNinjamannn

Here is a version which works with the latest Flask version and uses 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))     
Answered By: ikreb
Categories: questions Tags: , , , ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.