如何解决Django选择查询时间差
| 我正在尝试在django中查询数据库表,其中包括以下各列:id | start_time | end_time
我可以直接在查询中获得差值,而不是获取两者的单独值?
达到此效果的方法:
SELECT id,Diff(start_time,end_time) FROM myTable
解决方法
QuerySet.extra()
允许您为列指定任意表达式。请注意,结果将取决于DB。
,这可以完全通过Django 1.10及更高版本中的ORM完成。使用这样的模型:
class Timer(models.Model)
start_time = models.DateTimeField()
end_time = models.DateTimeField()
您可以使用以下持续时间注释对象:
from django.db.models import DurationField,ExpressionWrapper,F
Timer.objects.annotate(duration=ExpressionWrapper(F(\'end_time\') - F(\'start_time\'),output_field=DurationField()))
,在我看来,最简单的方法是添加带有差异的第三列,并在每次修改对象时更新它,如下所示:
class Timer(models.Model)
start_time = models.DateTimeField()
end_time = models.DateTimeField()
diff_time = models.DateTimeField()
def __init__(self,*args,**kwargs):
super(Timer,self).__init__(*args,**kwargs)
self.diff_time = self.end_time - self.start_time
def save(self,**kwargs):
self.diff_time = self.end_time - self.start_time
super(Timer,self).save(*args,**kwargs)
我试图寻找一个带有注释的解决方案,但是在mysql和postgres中都不支持聚合函数。即使在哪里,似乎也可以用一个额外的列来折衷,因为不必为每个查询的每一行计算差异!
哦,您可以这样检索您想要的内容:
Timer.objects.values(\'id\',\'diff_time\')
,从Django 1.8开始,建议不要使用annotate
+RawSQL
extra
。以下适用于MySQL:
res = MyTable.objects.annotate(duration=RawSQL(\'datediff(endtime,starttime)\',()))
# examine the results
print res.values_list(\'duration\',\'starttime\',\'endtime\')
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。