如何在日期之间找到差距?

时间:2015-08-24 19:33:38

标签: python django algorithm datetime django-models

我正在创建一个应用程序,您可以将任务分配给人。

class Task(models.Model):
    TASK_CHOICES = (
        ('Task_1', 'Task_1'),
        ('Task_2', 'Task_2'),
        ('Task_3', 'Task_3'),
    )
    Person = models.ManyToManyField(Person, blank=True, null=True)
    start_date = models.DateField(null=True, blank=True)
    end_date = models.DateField(null=True, blank=True)
    task = models.CharField(max_length=500, choices=TASK_CHOICES)

    def __str__(self):
        return '%s' % self.task

我的问题是:我怎样才能获得未分配给任何任务的第一个日期?

正如您所看到的,2013-10-16未分配给任何任务,我希望得到该日期。

enter image description here

到目前为止,我试图做一些查询集。

filtered_tasks = Task.objects.filter(person='HereHere', start_date_gte='2013-10-10').order_by('start_date')

然后列出元组列表。

获得

date_tuples = [(d.start_date, d.end_date) for d in filtered_tasks]

[(datetime.datetime(2013,10,10), datetime.datetime(2013,10,15),
(datetime.datetime(2013,10,17), datetime.datetime(2013,10,23),
(datetime.datetime(2013,10,24), datetime.datetime(2013,10,31)
]

正如您所看到的,task2 start_datetask1 end_date之间存在差距。我被困在这里,我不知道如何告诉Python获取没有分配任务的日期(16.10)

1 个答案:

答案 0 :(得分:1)

在计算机中使用日期时,最好使用closed-open notation。换句话说,第一个日期或日期时间是实际开始,但结尾被列为未包含在集合中的第一个日期时间。换句话说,您的数据可能如下所示:

function findPos(obj) {
    var curtop = 0;
    if (obj.offsetParent) {
        do {
            curtop += obj.offsetTop;
        } while (obj = obj.offsetParent);
    return [curtop];
    }
}

一旦您的数据以完全开放的方式表示,那么您只需要获得结束日期的间隔减去开始日期:

data = [(datetime.datetime(2013,10,10), datetime.datetime(2013,10,16)),
(datetime.datetime(2013,10,17), datetime.datetime(2013,10,24)),
(datetime.datetime(2013,10,24), datetime.datetime(2013,11,1)) 
]

如果您不想更改为使用封闭式开启,只需检查超过1天的间隔,但这将开始导致您遇到麻烦。

如果您使用的是postgres 9.2+,您可能需要查看使用范围类型,因为它们可以在数据库中轻松完成这些操作。