使用Django(queryset)postgres计算一年中周期的天数

2024-05-23 20:59:41 发布

您现在位置:Python中文网/ 问答频道 /正文

我想知道如何在数据库中计算一年中的周期总数。例如,计算一年的总假期。你知道吗

我正在使用:

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天。你知道吗


Tags: djangopy数据库models地址postgresrecorddays
3条回答

下面是获取句点列表的简单方法。你知道吗

从系统中取出所有休假记录,并找出每个记录的天数。你知道吗

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)

通过使用^{}^{}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?。你知道吗

编辑: 如果您不想每次迭代都命中DB,可以进行一个优化,即使用django^{}

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

我想我有点晚了。您可以在一个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(...)子句中,可以添加过滤条件,例如datetimeuser specific data


说明

  1. “integer”格式(在diff_date_in_integer注释字段中)中注释leavedatetoleavedatefrom之间的差异
  2. diff_date_in_integer数据转换为days
  3. 使用aggregate()函数和Sum()DB函数,我们求出总天数。你知道吗

相关问题 更多 >