【发布时间】:2016-04-23 01:22:20
【问题描述】:
我不确定如何仅使用时间字段来过滤我的数据库。现在我有一个类叫DatabasePolgygon
class DatabasePolygon(dbBase):
__tablename__ = 'objects'
begin_time = Column(DateTime) # starting time range of shape
end_time = Column(DateTime) # ending time range of shape
# Other entries not relevant to this question
begin_time 和 end_time 可能等于2006-06-01 14:45:23 等值,它们表示对象(在本例中为绘图上的形状)覆盖的 X 轴范围。我想允许对我的用户进行高级搜索,特别是询问在一段时间内出现的所有对象。但是,如何使用 DateTime 字段完成此操作?
# Grab all shapes that appear above this certain time
query_result = query_result.filter(
DatabasePolygon.begin_time >= datetime.strptime(rng['btime']), %H:%M:%S')
)
问题是我将带有Y-m-d H-M-S 的日期时间对象与仅带有H-M-S 的对象进行比较。一个示例场景是,如果用户想要所有出现在 14:45:24 范围之外的对象,无论年/月/日如何,因此我们将拥有 rng['btime']=14:45:24 和 begin_time=2006-06-01 14:45:23,这似乎并不实际比较时过滤任何内容。
有什么方法可以有效地比较这列数据中的时间吗?我希望能够做类似的事情
# Grab all shapes that appear above this certain time
query_result = query_result.filter(
DatabasePolygon.begin_time.time() >= datetime.strptime(rng['btime']), %H:%M:%S').time()
)
【问题讨论】:
-
底层数据库索引在日期时间列上的工作方式意味着没有有效的方法来做到这一点,除非一些非常具体的事情是真的。例如。如果您的数据跨越的天数很少,那么您可以对每天的时间范围进行单独的有效查询。除此之外,我认为你最好的选择是将所有数据拉到 python 然后过滤。一些数据库支持功能索引——这可以让你做你想做的事,但我不知道 sqlalchemy 是否支持它们。
-
进一步评论来自@Tom re: 索引 - SQLite 在版本 3.9.0 中增加了对表达式索引的支持(参考:here)所以如果 SQLAlchemy 产生适当的 SQL 查询,那么 SQLite 应该能够有效地处理它们。
-
@GordThompson 不太清楚在这种情况下如何理解索引,如果您打算回答,能否提供一些代码?
-
sqlite.org/expridx.html - 在您的情况下,表达式仅将日期时间列转换为时间部分(然后对其进行索引)。
标签: python sqlite datetime sqlalchemy