查询以获取日期重叠

时间:2012-12-22 12:39:57

标签: python django

我有一个名为model的{​​{1}},用于确定每个人在Company_Position_PersonstartDate之间指定位置的公司工作:

endDate

现在我想找到基于日期重叠的特定人员的同事列表。我的意思是找出在特定人员工作的同时在该公司工作的人。例如我在公司工作{{ 1}} - 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同一家公司工作的另一个人此时是我的同事。 我发现custome managers可能很有用,但我不知道在运行查询时如何找出重叠以及如何将特定人员的startDate=2012-08-01endDate=2013-21-12传递给经理。

2 个答案:

答案 0 :(得分:3)

它们是Overlaping的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_datetarget_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 )

答案 1 :(得分: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)