如何在sqlalchemy中比较日期?

2024-09-24 06:20:24 发布

您现在位置:Python中文网/ 问答频道 /正文

我有以下简单的设置,其中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()

问题是它找不到我希望它找到的内容,除非我修改输入日期如下:

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

但那看起来不太好。有什么办法让我用正确的方法来做吗?


Tags: datereturnsessiondef格式allfilterquery
2条回答

问题是SomeType.date列不是简单的date,而是datetime列,因此它还包含一个时间组件。

此类型不匹配是问题的原因。如果是这种情况,则应遵循以下原则:

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

这里我们基本上是使用MySql的^{}函数castdatetimedate

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

^{}对象代替fromDatetoDate的字符串怎么样?

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

相关问题 更多 >