我有以下简单的设置,其中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()
但这看起来并不好。关于如何以正确的方式做到这一点的任何想法?
答案 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()
答案 1 :(得分:0)
问题是,您的SomeType.date
列不是简单date
,而是datetime
列,因此它还包含时间组件。
此类型不匹配是导致问题的原因。如果是这种情况,则应遵循以下规则:
session.query(SomeType).filter(func.date(SomeType.date) >= fromDate, func.date(SomeType.date) <= toDate).all()
我们使用MySql的DATE(...)
函数基本上cast
datetime
到date
。
但是,我可能也更喜欢使用date(time)
数据类型而不是字符串。您很幸运,大多数数据库都隐式允许解析符合ISO标准的DATE字符串表示。