如何比较sqlalchemy中的日期?

Mar*_*son 3 python mysql sqlalchemy

我有以下简单的设置,其中fromDate和toDate是格式为"YYYY-MM-DD"的字符串:

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

def findAll(fromDate, toDate):
    return session.query(SomeType).filter(SomeType.date >= fromDate, SomeType.date <= toDate).all()
Run Code Online (Sandbox Code Playgroud)

问题是它找不到我想要它找到的东西,除非我像这样修改输入日期:

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

但这看起来并不好.关于如何以正确的方式做到这一点的任何想法?

fal*_*tru 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()
Run Code Online (Sandbox Code Playgroud)


van*_*van 7

问题是您的SomeType.date列不是 simple date,而是datetime列,因此它还包含时间组件。

这种类型不匹配是导致您的问题的原因。如果是这种情况,那么以下应该有效:

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

我们基本上cast datetime使用MySqldateDATE(...)功能。

但是,我可能更喜欢使用date(time)数据类型而不是字符串。您很幸运,大多数数据库隐式允许解析符合 ISO 标准的 DATE 字符串表示形式。