2012-01-17 3 views
65

Вот модель: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 

Я знаю, что это не правильно, но как это сделать правильно?

Заранее благодарен!

ответ

110

На самом деле, ваш запрос прямо за опечатку, кроме: Ваш фильтр за исключением всех записей: вы должны изменить <= для >= и наоборот:

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

Btw вместо ''1985-01-17'' вы также можете использовать' datetime.date (1985, 1, 17) '- в некоторых средах может быть проще работать или работать. – rippleslash

+1

@rippleslash: вы правы, и в идеале следует использовать правильный тип данных для параметров. Однако все базы данных понимают также формат ISO 8601 для дат, что также является лексикографическим порядком. По этой причине для простых примеров я обычно использую даты в формате ISO - легче читать. – van

+1

Ребята, вы также должны помнить одно. НЕ помещайте дату в кавычки, как 'User.birthday <=" 1988-01-17 "' это не сработает. 'Ошибка:« Час должен быть от 0 до 23 ». Вместо этого используйте знак препинания, как @van сказал' User.birthday <= '1988-01-17'' – pawpaw

0
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 

Желание может вам помочь.

Смежные вопросы