首页 > 解决方案 > 如何在 django 中计算时间

问题描述


我有这样的表:
id | name | time     |
1  | aaaa | 00:36:00 |
2  | aaaa | 01:00:00 |
3  | cccc | 00:10:00 |
4  | bbbb | 00:30:00 |
5  | cccc | 00:30:00 |

如何计算 Django 中每个名称的时间分组,如下所示:

name | time     |
aaaa | 01:36:00 |
bbbb | 00:30:00 |
cccc | 00:40:00 |

在 Django 中可以吗?
谢谢你的帮助!

标签: pythondjangodjango-viewsdjango-database

解决方案


如果您想按确切时间进行分组( Django Docs ),那么您可以像这样简单地聚合:

from django.db.models import Count
Model.objects.all().values("time").annotate(Count("id")).order_by()


То 聚合DateTimeFieldTimeField我们也可以使用(Django 文档)函数。将日期截断为重要组成部分。Trunc

类 Trunc(表达式,种类,output_field=None,tzinfo=None,is_dst=None,**额外)

Trunc采用单个表达式,表示DateFieldTimeFieldDateTimeField,一种表示日期或时间部分的种类,以及一个 output_field ,它是DateTimeField()TimeField()DateField()

特定于 TimeField 使用TruncHourTruncMinuteTruncSecond参见Django Docs - 使用示例:

>>> from datetime import date, datetime
>>> from django.db.models import Count
>>> from django.db.models.functions import (
...     TruncDate, TruncDay, TruncHour, TruncMinute, TruncSecond,
... )
>>> from django.utils import timezone
>>> import pytz
>>> start1 = datetime(2014, 6, 15, 14, 30, 50, 321, tzinfo=timezone.utc)
>>> Experiment.objects.create(start_datetime=start1,start_date=start1.date())
>>> melb = pytz.timezone('Australia/Melbourne')
>>> Experiment.objects.annotate(
...     date=TruncDate('start_datetime'),
...     day=TruncDay('start_datetime', tzinfo=melb),
...     hour=TruncHour('start_datetime', tzinfo=melb),
...     minute=TruncMinute('start_datetime'),
...     second=TruncSecond('start_datetime'),
... ).values('date', 'day', 'hour', 'minute', 'second').get()
{'date': datetime.date(2014, 6, 15),
 'day': datetime.datetime(2014, 6, 16, 0, 0, tzinfo=<DstTzInfo 'Australia/Melbourne' AEST+10:00:00 STD>),
 'hour': datetime.datetime(2014, 6, 16, 0, 0, tzinfo=<DstTzInfo 'Australia/Melbourne' AEST+10:00:00 STD>),
 'minute': 'minute': datetime.datetime(2014, 6, 15, 14, 30, tzinfo=<UTC>),
 'second': datetime.datetime(2014, 6, 15, 14, 30, 50, tzinfo=<UTC>)
}

推荐阅读