SQLAlchemy: как фильтровать поле даты?
Вот модель:
class User(Base):
...
birthday = Column(Date, index=True) #in database it 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
Я знаю, что это не правильно, но как это сделать правильно?
Ответы
Ответ 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
:
qry = DBSession.query(User).filter(User.birthday.between('1985-01-17', '1988-01-17'))
Ответ 2
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
Желание может помочь вам.
Ответ 3
если вы хотите получить весь период :
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