【问题标题】:How to compare dates in sqlalchemy?如何比较sqlalchemy中的日期?
【发布时间】:2014-01-23 07:29:04
【问题描述】:

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

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

【问题讨论】:

  • 第一个样本有什么问题? “它没有找到我想找到的东西”是什么意思?具体来说,它没有找到什么?

标签: python mysql sqlalchemy


【解决方案1】:

对于fromDatetoDate,使用datetime.datetime 对象而不是字符串怎么样?

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

【讨论】:

    【解决方案2】:

    问题是你的SomeType.date列不是简单的date,而是datetime列,所以它还包含一个时间分量。

    这种类型不匹配是您的问题的原因。如果是这种情况,那么以下应该可以工作:

    session.query(SomeType).filter(func.date(SomeType.date) &gt;= fromDate, func.date(SomeType.date) &lt;= toDate).all()

    我们基本上使用cast datetimedate 使用MySql 的DATE(...) 函数。

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

    【讨论】:

    • 还需要from sqlalchemy import func
    猜你喜欢
    • 2019-12-10
    • 1970-01-01
    • 2013-04-20
    • 2019-05-18
    • 2021-02-11
    • 2016-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多