2012-12-22 3 views
1

J'ai un model nommé Company_Position_Person qui déterminent chaque personne travaille dans une entreprise avec la position spécifiée entre startDate et endDate:requête pour obtenir la date 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) 

Maintenant, je veux trouver la liste des collègues d'une personne spécifique Je veux dire savoir quelles personnes travaillent dans cette entreprise en même temps qu'une personne spécifique travaille.Par exemple, je travaille dans la société au startDate=2012-01-01 - endDate=2012-21-12. Une autre personne qui travaille dans la même entreprise au startDate=2012-08-01 - endDate=2013-21-12 est un collègue de moi en ce moment. J'ai découvert que custome managers peut être utile, mais je ne sais pas comment trouver chevauchement lors de l'exécution de la requête et comment passer startDate et endDate d'une personne spécifique au gestionnaire.

+1

http://stackoverflow.com/a/325939/298479 est le « algorithme », vous devez vérifier si les deux plages de dates se chevauchent. – ThiefMaster

+0

tnx, je vais vérifier. –

Répondre

2

Ils sont 4 cas pour overlaping et 2 pour pas 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 

Pas overlaping quand taget_end_date < source_begin_date ou target_begin_date > source_end_date. Alors overlaping où:

NOT (taget_end_date < source_begin_date or target_begin_date > source_end_date) 

C'est l'égal que:

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

Cela équivaut à

taget_end_date >= source_begin_date and target_begin_date <= source_end_date 

Pour votre code:

source = Company_Position_Person.objects.get(pk = 12) 
targets = Company_Position_Person.filter(startDate__lte = target.endDate , 
              endDate__gte = target.startDate) 
1

Vous pouvez essayer cette requête:

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