2012-01-17 31 views
65

Aquí es el modelo:SQLAlchemy: cómo filtrar el campo de fecha?

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

quiero filtrar entre dos fechas, por ejemplo, para elegir a todos los usuarios en intervalos de 18-30 años.

¿Cómo implementarlo con SQLAlchemy?

pienso:

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

# means age >= 24 and age <= 27 

Sé que esto no es correcto, pero ¿cómo hacerlo correcto?

¡Gracias de antemano!

Respuesta

110

De hecho, la consulta es correcto excepto por el error tipográfico: el filtro está excluyendo todos los registros: debe cambiar el <= para >= y viceversa:

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

También puede utilizar between:

qry = DBSession.query(User).filter(User.birthday.between('1985-01-17', '1988-01-17')) 
+9

Por cierto, en lugar de ''1985-01-17'', también puede usar' datetime.date (1985, 1, 17) '- puede ser más fácil de usar o trabajar en algunos entornos. – rippleslash

+1

@rippleslash: tiene razón, e idealmente uno debe usar el tipo de datos adecuado para los parámetros. Sin embargo, todas las bases de datos también comprenden el formato ISO 8601 para las fechas, que también es un orden lexicográfico. Por esta razón, para ejemplos simples generalmente utilizo fechas con formato ISO, más fácil de leer. – van

+1

Chicos, también recordarán una cosa. NO ponga la fecha entre comillas como 'User.birthday <=" 1988-01-17 "' no funcionará. 'Error:" La hora debe ser de 0 a 23 "' En su lugar use el signo de puntuación como @van dijo '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() 

es igual a:

select 
    count(id) 
from 
    Chance 
where 
    repo_id=:repo_id 
    and status='1' 
    and date(apple_time) <= end 
    and date(apple_time) >= start 

deseo puede ayudarlo.

Cuestiones relacionadas