【发布时间】:2018-12-12 14:33:52
【问题描述】:
我有一个预订系统,我将预订的日期范围保存在 DATERANGE 列中:
booked_date = Column(DATERANGE(), nullable=False)
我已经知道我可以使用booked_date.lower 或booked_date.upper 访问实际日期
例如我在这里这样做:
for bdate in room.RoomObject_addresses_UserBooksRoom:
unaviable_ranges['ranges'].append([str(bdate.booked_date.lower),\
str(bdate.booked_date.upper)])
现在我需要按给定的日期范围过滤我的预订。例如,我想查看 01.01.2018 到 10.01.2018 之间的所有预订。
通常很简单,因为日期可以这样比较:date <= other date
但如果我用 DATERANGE 来做:
the_daterange_lower = datetime.strptime(the_daterange[0], '%d.%m.%Y')
the_daterange_upper = datetime.strptime(the_daterange[1], '%d.%m.%Y')
bookings = UserBooks.query.filter(UserBooks.booked_date.lower >= the_daterange_lower,\
UserBooks.booked_date.upper <= the_daterange_upper).all()
我收到一个错误:
AttributeError: Neither 'InstrumentedAttribute' object nor 'Comparator' object associated with UserBooks.booked_date has an attribute 'lower'
编辑
我找到了一个带有有用范围运算符的sheet,看起来有更好的选择来做我想做的事情,但为此我需要以某种方式创建一个range variable,但python 不能这样做。所以我还是一头雾水。
在我的数据库中,我的日期范围列条目如下所示:
[2018-11-26,2018-11-28)
编辑
我正在尝试使用原生 SQL 而不是 sqlalchemy,但我不明白如何创建 daterange 对象。
bookings = db_session.execute('SELECT * FROM usersbookrooms WHERE booked_date && [' + str(the_daterange_lower) + ',' + str(the_daterange_upper) + ')')
【问题讨论】:
-
Remember that the actual range objects in Python are a psycopg2 feature,因此如果您需要生成此类以用作查询中的值,请阅读他们的文档。此外,如果使用 SQLAlchemy 而不是原始 SQL,请检查它们的范围运算符支持:docs.sqlalchemy.org/en/latest/dialects/…
-
我知道这一点。您链接到的问题也是我的问题。也许我错过了一些东西,所以我会重新阅读所有内容。但我认为 .lower 和 .upper 应该适用于我的情况。
标签: python sql postgresql sqlalchemy date-range