【问题标题】:Django Query : how do I find the maximum time duration from start and end time fields?Django Query:如何从开始和结束时间字段中找到最长持续时间?
【发布时间】:2017-01-05 21:56:25
【问题描述】:

这是我的 Django 模型:

class Shift(models.Model):
        worker = models.OneToOneField('Worker',null=True)
        date = models.DateField(null=True)
        shiftTime = models.CharField(max_length=10, default="N/A")
        timeIn = models.TimeField(null=True)
        timeOut = models.TimeField(null=True)

我需要找到在给定日期范围内在办公室工作时间最长的员工。如何从 Django 查询中的 timeIn 和 timeOut 字段计算持续时间?

编辑:我不想使用另一个属性 duration 因为这似乎是多余的。除了使用原始查询或持续时间属性之外,还有其他方法吗?

【问题讨论】:

标签: sql django python-2.7 django-models django-queryset


【解决方案1】:

Django 1.10 通过 ORM 引入了natively do date/time diffs 的功能。此查询将为您提供最长的班次:

from django.db.models import DurationField, ExpressionWrapper, F

longest_shift = Shift.objects.annotate(shift_length=ExpressionWrapper(
                                           F('timeOut') - F('timeIn'),
                                           output_field=DurationField()))\.
                                           order_by('-shift_length').first()

您可以根据需要通过在annotate() 之前添加filter() 子句来为特定日期范围添加过滤器。

【讨论】:

    【解决方案2】:

    遍历对象并获得 timeIn 和 timeOut 之间的最大持续时间。

    def get_largest_time_diff():
        shift_objs = Shift.objects.all()
        time_diff = 0
    
        if shift_objs:
           time_diff = shift_objs[0].timeOut - shift_objs[0].timeIn
    
           for tm in shift_objs[1:]:
               if time_diff < tm.timeOut - tm.timeIn:
                   time_diff = tm.timeOut - tm.timeIn
    
        return time_diff
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-22
      • 2013-10-24
      • 2014-05-01
      • 2019-08-24
      相关资源
      最近更新 更多