2015-08-24 22 views
0

我正在製作一個應用程序,您可以將任務分配給人員。如何獲得日期之間的差距?

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)

+0

我不確定我是否完全理解你的問題,但是從你所說的聽起來像你只是試圖弄清楚,如果你的查詢結果中的所有條目都是連續的?如果是這樣的話,你可以像Python那樣用if(datetime2 - datetime1).days> 1'來查看兩個日期時間對象的差異是否超過一天。 –

回答

1

在計算機中使用日期時,最好使用closed-open notation。換句話說,第一個日期或日期時間是實際的開始,但結尾被列爲不包含在集合中的第一個日期時間。換句話說,你的數據看起來是這樣的:

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)) 
] 

一旦你在封閉開符號您的數據,那麼你只需要得到結束日期減去開始日期的間隔:

for i, d in enumerate(data): 
    if i > 0: 
     if d[0] - data[i-1][1] > datetime.timedelta(0): 
      print("Gap") 

如果您不想更改爲使用closed-open,只需檢查超過1天的時間間隔,但這會開始導致您在路上遇到麻煩。

如果您使用的是postgres 9.2+,您可能需要查看使用範圍類型,因爲它們使數據庫中的這些內容變得容易。

+0

但是在你的'數據'中沒有差距,你的循環說有'差距' – HereHere

+0

你是否閱讀了關於Closed-Open Notation的說明? –

+0

但是你有兩個重疊的日期'2013,10,24' - 在我的應用程序中,當我添加任務時,不會有重疊的日期。 – HereHere