2012-01-17 25 views
65

Ecco il modello:SQLAlchemy: come filtrare il campo della data?

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

voglio filtrare tra due date, per esempio di scegliere tutti gli utenti di intervallo 18-30 anni.

Come implementarlo con SQLAlchemy?

penso:

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

# means age >= 24 and age <= 27 

So che questo non è corretto, ma come fare corretta?

Grazie in anticipo!

risposta

110

In realtà, la query è giusto tranne che per l'errore di battitura: il filtro è escludendo tutti i record: è necessario modificare il <= per >= e 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') 

Inoltre è possibile utilizzare between:

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

Btw, invece di ''1985-01-17'', puoi anche usare' datetime.date (1985, 1, 17) '- potrebbe essere più facile da ottenere o lavorare in alcuni ambienti. – rippleslash

+1

@rippleslash: hai ragione, e idealmente si dovrebbe usare il tipo di dati corretto per i parametri. Tuttavia tutti i database comprendono anche il formato ISO 8601 per le date, che è anche l'ordine lessicografico. Per questo motivo, per semplici esempi, utilizzo generalmente date con formattazione ISO, più facili da leggere. – van

+1

Ragazzi, ricordate anche una cosa. NON mettere la data tra virgolette come 'User.birthday <=" 1988-01-17 "' non funzionerà. 'Errore:" L'ora deve essere compresa tra 0 e 23 "' Usa invece il segno di punteggiatura come @van ha detto '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() 

è uguale a:

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

desiderio può aiutarti.

Problemi correlati