我正在尝试找出如何计算数据库中一年中的总期间数。例如,计算一年中的总叶子。
我正在使用:
Django - 1.11.7
Postgres - 9.4
这是我的模型。py:
class Leave(models.Model):
leavedatefrom = models.DateField()
leavedateto = models.DateField()
说明问题的示例:
leaves taken in 1 year (01/01/2019 - 31/12/2019)
record 1: (leavedatefrom)01/02/2019 - (leavedateto)05/02/2019 ===> 5 days
record 2: (leavedatefrom)10/05/2019 - (leavedateto)12/05/2019 ===> 3 days
Total days = 5 + 3 = 8 days
如何在Django中计算一年中数据库中的天数?基本上我想在上面的示例中得到8天。
答案 0 :(得分:3)
我觉得我来晚了。您可以通过一个SQL查询获得总天数
from django.db.models import F, IntegerField, ExpressionWrapper, Sum
Leave.objects.filter(...).annotate(
diff_date_in_integer=ExpressionWrapper(F('leavedateto') - F('leavedatefrom'), output_field=IntegerField())
).annotate(
diff_date_in_days=ExpressionWrapper(F('diff_date_in_integer') / (1000000 * 60 * 60 * 24), output_field=IntegerField())).aggregate(
sum=Sum('diff_date_in_days'))
在 filter(...)
子句中,您可以添加过滤条件,例如datetime
或 user specific data
leavedateto
和 leavedatefrom
之间的区别格式(在diff_date_in_integer
带注释的字段中)diff_date_in_integer
数据转换为 days
aggregate()
函数和 Sum()
DB函数,我们可以找到总天数。答案 1 :(得分:0)
以下是获取期间列表的幼稚方法。
从系统中获取所有请假记录,并为每条记录找出天数。
leaves = Leave.objects.filter(leavedatefrom__gte=datetime.date(2019, 1, 1), leavedateto__lte=datetime.date(2019, 12, 31
for leave in leaves:
days = (leave.leavedatefrom.date() - leave. leavedateto.date()).days()
period_list.append(days)
total_leaves = sum(period_list)
答案 2 :(得分:0)
基本上,您可以使用gte
和lte
django查询进行查询以获取一年中所有相关的叶子。
例如:
import datetime
leaves = Leave.objects.filter(
leavedatefrom__gte=datetime.date(2019, 1, 1),
leavedateto__lte=datetime.date(2019, 12, 31)
)
然后遍历所有叶子并计算它们之间的天差,并将其求和成另一个变量:
total_days = 0
for leave in leaves:
total_days += (leave.leavedateto - leave.leavedatefrom).days
print total_days
有关计算日期范围的更多详细信息和选项,请参见How to calculate number of days between two given dates?。
编辑:
如果您不想每次迭代都访问数据库,可以进行的一种优化是使用django values_list()
:
leaves = Leave.objects.filter(
leavedatefrom__gte=datetime.date(2019, 1, 1),
leavedateto__lte=datetime.date(2019, 12, 31)
).values_list('leavedatefrom', 'leavedateto')
total_days = 0
for leavedateto, leavedatefrom in leaves:
total_days += (leavedateto - leavedatefrom).days
print total_days