我有一个名为model
的{{1}},用于确定每个人在Company_Position_Person
和startDate
之间指定位置的公司工作:
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-01
和endDate=2013-21-12
传递给经理。
答案 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_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 )
答案 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)