2014-01-23 5 views
2

У меня есть следующая простая установка, где FromDate и Todate являются строками по формату «YYYY-MM-DD»:Как сравнить даты в sqlalchemy?

class SomeType(Base): 
    date = Column(DateTime) 

def findAll(fromDate, toDate): 
    return session.query(SomeType).filter(SomeType.date >= fromDate, SomeType.date <= toDate).all() 

Проблема заключается в том, что он не находит то, что я хочу, чтобы найти, если я изменить даты ввода как:

def findAll(fromDate, toDate): 
    fromDate = fromDate + " 00:00" 
    toDate = toDate + " 24:00" 
    return session.query(SomeType).filter(SomeType.date >= fromDate, SomeType.date <= toDate).all() 

Но это не выглядит хорошо. Любые идеи о том, как я могу сделать это правильно?

+0

Что не так с первым образцом? Что вы подразумеваете под словом «он не находит то, что я хочу найти»? Что, в частности, не находит? –

ответ

7

Как об использовании datetime.datetime объектов вместо строк для fromDate, toDate?

from datetime import datetime, timedelta 

def findAll(fromDate, toDate): 
    fromDate = datetime.strptime(fromDate, '%Y-%m-%d') 
    toDate = datetime.strptime(toDate, '%Y-%m-%d') + timedelta(days=1) 
    return session.query(SomeType).filter(
     SomeType.date >= fromDate, 
     SomeType.date < toDate).all() 
0

Проблема заключается в том, что ваш SomeType.date столбец не просто date, но datetime колонка, поэтому она содержит также компонент времени.

Этот тип несоответствия является причиной вашей проблемы. Если это так, то должно работать:

session.query(SomeType).filter(func.date(SomeType.date) >= fromDate, func.date(SomeType.date) <= toDate).all()

, где мы в основном castdatetime к date используя DATE(...) функцию MySql.

Однако, я бы предпочел работать с типами данных date(time) вместо строк. Вам просто повезло, что большинство баз данных неявно допускают разбор синтаксических представлений DATE.