(使用 django 1.11.2、python 2.7.10、mysql 5.7.18)
如果我们想象一个简单的模型:
class Event(models.Model):
happened_datetime = DateTimeField()
value = IntegerField()
运行类似于以下内容的最优雅(和最快)的方式是什么:
res = Event.objects.all().aggregate(
Avg('happened_datetime')
)
但这将能够为查询集的所有成员提取一天中的平均时间。就像是:
res = Event.objects.all().aggregate(
AvgTimeOfDay('happened_datetime')
)
是否可以直接在数据库上执行此操作?即,无需为每个查询集成员运行长循环客户端?
编辑:
可能有一个解决方案,沿着这些思路,使用原始 SQL:
select sec_to_time(avg(time_to_sec(extract(HOUR_SECOND from happened_datetime)))) from event_event;
性能方面,这在笔记本电脑上运行约 23k 行的时间为 0.015 秒,未进行优化等。假设这可以产生准确/正确的结果,并且由于时间只是次要因素,我可以使用它吗?