【问题标题】:Calculate number of days of periods in year using Django (queryset) - postgres使用 Django(查询集)计算一年中的天数 - postgres
【发布时间】:2019-05-21 05:18:47
【问题描述】:

我想弄清楚如何计算数据库中一年中的总时间段。以计算一年的总叶数为例。

我正在使用:

Django - 1.11.7
Postgres - 9.4

这是我的models.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 天。

【问题讨论】:

  • 您要将结果保存在哪里?你已经有记录了吗?
  • 在模型中是 - 字段:(leavedatefrom 和 leavedateto)
  • 太棒了。请参阅下面的答案 - 希望它能回答您的问题。

标签: python django postgresql django-queryset


【解决方案1】:

我想我来晚了。您可以在单个 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" 格式(以@ 987654327@带注释的字段)
  2. diff_date_in_integer 数据转换为 days
  3. 使用aggregate()函数和Sum() DB函数,我们得到了总天数。

【讨论】:

    【解决方案2】:

    您基本上可以通过使用gtelte 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
    

    【讨论】:

    • 在迭代过程中会命中 DB N 次。
    • 感谢@JPG - 也可以在查询中使用values_list 并检查值。
    【解决方案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)
    

    【讨论】:

      猜你喜欢
      • 2023-03-10
      • 1970-01-01
      • 1970-01-01
      • 2019-07-21
      • 2018-09-10
      • 1970-01-01
      • 2021-10-22
      • 1970-01-01
      • 2019-08-17
      相关资源
      最近更新 更多