1

我有一个model名字Company_Position_Person,可以确定每个人在公司工作,并在startDate和之间指定职位endDate

class Company_Position_Person(models.Model):
    company_position=models.ForeignKey(Company_Position)
    person=models.ForeignKey(Person)
    startDate=models.CharField(max_length=25)
    endDate=models.CharField(max_length=25)

现在我想根据日期重叠查找特定人员的同事列表。我的意思是找出在特定人员工作的同时在这家公司工作的人。例如,我在公司工作startDate=2012-01-01- endDate=2012-21-12。另一个人在同一家公司工作startDate=2012-08-01-endDate=2013-21-12是我此时的同事。我发现客户经理可能很有用,但我不知道如何在运行查询时找出重叠以及如何将startDate特定endDate人员传递给经理。

4

2 回答 2

3

它们是重叠的 4 种情况和不重叠的 2 种情况:

......********.......   Source User
........****.........   Target User Overlaping
....*****............   Target User Overlaping
..........*******....   Target User Overlaping
....************.....   Target User Overlaping

......********.......   Source User
..**.................   Target User Not Overlaping
................**...   Target User Not Overlaping

taget_end_date < source_begin_date或时不重叠target_begin_date > source_end_date。然后重叠在哪里:

NOT (taget_end_date < source_begin_date or target_begin_date > source_end_date )

即等于:

   not (taget_end_date < source_begin_date ) 
 and 
   not( target_begin_date > source_end_date )

那等于

 taget_end_date >= source_begin_date  and  target_begin_date <= source_end_date 

对于您的代码:

source = Company_Position_Person.objects.get( pk = 12 )
targets = Company_Position_Person.filter( startDate__lte = target.endDate ,
                                          endDate__gte = target.startDate )
于 2012-12-22T14:55:20.467 回答
1

你可以试试这个查询:

person = Company_Position_Person.objects.get(pk=...)
persons = Company_Position_Person.objects.exclude(startDate__gt=person.endDate, endDate__lt=person.startDate,pk=person.pk)
于 2012-12-22T15:01:58.363 回答