2012-12-22 33 views
1

我有一個model名爲Company_Position_Person決定每個人在公司與startDateendDate之間的指定位置:查詢來獲取最新overlaping

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) 

現在我想找到一個特定的人的同事的列表根據日期overlapping.I意味着找出哪些人在這家公司工作的同時,一個特定的人works.For例如我在公司工作startDate=2012-01-01 - endDate=2013-21-12是 - endDate=2012-21-12,在同一家公司在startDate=2012-08-01工作。另外一個人這時候我的同事。 我發現custome managers可能是有用的,但我不知道如何找出重疊,同時運行的查詢,以及如何通過startDate和特定的人給經理的endDate

+1

http://stackoverflow.com/a/325939/298479是「算法」你需要檢查,如果兩個日期範圍重疊。 – ThiefMaster

+0

TNX,我會檢查出來。 –

回答

2

他們是4例Overlaping和2沒有overlaping:

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

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

沒有overlaping時taget_end_date < source_begin_datetarget_begin_date > source_end_date。 然後overlaping其中:

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

你可以試試這個查詢:

person = Company_Position_Person.objects.get(pk=...) 
persons = Company_Position_Person.objects.exclude(startDate__gt=person.endDate, endDate__lt=person.startDate,pk=person.pk)