Sélection des périodes
Table des matières
Gestion des dates
Dates simples
Pour rechercher tous les événements qui ont une date dans une période (ex : toutes les sessions qui débutent entre le 1er janvier 2022 et le 31 mars 2022).
Deux conditions simples :
- Date xxxx – supérieure ou égale à – 1er janvier 2022 ET
- Date xxxx – inférieure ou égale à – 31 mars 2022
Exemple :
Dates simples
Pour sélectionner des événements gérés avec une date de début uniquement (ou « date d’effet ») comme les versions des services ou les grades dans l’historique de grades des agents (exemple ci-après). Il est nécessaire de trouver la dernière ligne pour la clé (ex : matricule de l’agent) pour laquelle il n’existe pas de ligne à une date postérieure dans la même table. Pour cela, il faut faire une auto-jointure externe sur la table visée et ne garder que les lignes dans lesquelles la table jointe en externe est vide.
Exemple - dernier grade de l’agent :
- Tables :
- GRH : Agents (A)
- GRH : Carrières des Agents (B)
- GRH : Historique des Grades (C)
- GRH : Historique des Grades (D)
- Administration : Grades (E)
- Champs :
- Nom (A)
- Prénom (A)
- Grade (E)
- Date d’obtention du Grade (C)
- Conditions :
- N°Agent (A) égal(e) à N°Agent (B)
ET
- Matricule (B) égal(e) à Matricule (C)
ET
- Matricule (C) égal(e) à D.MATRICULE_CARRIERE (+)
ET
- Date d’obtention du Grade (C) strictement inférieur(e) à D.DATE_OBTENTION_GRADE (+)
ET
- N°Obtention du Grade (D) est vide
ET
- N°Grade (C) égal(e) à N°Grade (E)
Dans cet exemple, la table « C » est utilisée pour trouver le dernier grade de l’agent et la table « D » est utilisée pour trouver le grade que l’agent aurait obtenu après.
Exemple 2 : dernier grade de l’agent au 31/03/2022
- Tables :
- GRH : Agents (A)
- GRH : Carrières des Agents (B)
- GRH : Historique des Grades (C)
- GRH : Historique des Grades (D)
- Administration : Grades (E)
- Champs :
- Nom (A)
- Prénom (A)
- Grade (E)
- Date d’obtention du Grade (C)
- Conditions :
- N°Agent (A) égal(e) à N°Agent (B)
ET
- Matricule (B) égal(e) à Matricule (C)
ET
- Date d’obtention du Grade (C) inférieur(e) ou égal(e) à ‘2022-03-31’
ET
- Matricule (C) égal(e) à D.MATRICULE_CARRIERE (+)
ET
- Date d’obtention du Grade (C) strictement inférieur(e) à D.DATE_OBTENTION_GRADE (+)
ET
- Date d’obtention du Grade (D) inférieur(e) ou égal(e) à ‘2022-03-31’ (+)
ET
- N°Obtention du Grade (D) est vide
ET
- N°Grade (C) égal(e) à N°Grade (E)
Le principe est quasi-identique : il suffit d’ajouter deux conditions pour ne conserver que les grades obtenus en table « C » et « D » avant la date butoir. Attention : ne pas oublier que la table « D » est en jointure externe, il faut que la condition butoir soit également dans cette jointure externe sans quoi la recherche serait faussée (la date d’obtention de « D » ne peut pas à la fois être vide et inférieure ou égale à une date butoir).
Autre méthode possible : Une autre manière de procéder, sans jointure externe, est d’utiliser deux fois la table en auto-jointure mais en ajoutant une condition fonctionnelle :
- Plus grand Date d’obtention du Grade (D) égal(e) à Date d’obtention du Grade (C)
Démonstration de la méthode l’auto-jointure externe
Soit l’historique de grade « H » :
Avec une auto-jointure interne : H1.Matricule = H2.Matricule ET H1.DateObtention < H2.DateObtention
Problème : La ligne « Cap » a disparu.
Avec une auto-jointure externe : H1.Matricule = H2.Matricule (+) ET H1.DateObtention < H2.DateObtention (+)
Avec une auto-jointure externe et la clause « est vide » : H1.Matricule = H2.Matricule (+) ET H1.DateObtention < H2.DateObtention (+) ET H2.DateObtention est vide
La requête affiche le dernier grade de l’agent
Chevauchement de période
Pour sélectionner tous les événements ayant des dates de début/fin en chevauchement avec la période de recherche. Ici, sont donc recherchés :
a. Les événements qui commencent avant la période et terminent après la période (barre verte au milieu/centre) ;
b. Les événements qui commencent avant la période et terminent pendant la période (barre verte en haut à gauche) ;
c. Les événements qui commencent pendant la période et terminent pendant la période (barre verte en haut à droite) ;
d. Les événements qui commencent pendant la période et terminent après la période (barre verte en bas/centre).
Sont exclus :
e. Les événements qui commencent et terminent avant le début de période (barre rouge de gauche) ;
f. Les événements qui commencent et terminent après la fin de période (barre rouge de droite).
Soit :
Les événements en rouge sont exclus de la recherche, les événements en vert sont inclus dans la recherche.
Par la suite, pour simplifier la lecture, nous admettrons :
- « DébutEvénement » est la date de début d’un événement ;
- « FinEvénement » est la date de fin du même événement ;
- « DébutRecherche » est la date de début de la période de recherche ;
- « FinRecherche » est la date de fin de la période de recherche.
Intuitivement, les conditions seraient les suivantes (dans le même ordre) :
a. DébutEvénement ≤ DébutRecherche ET FinEvénement ≥ FinRecherche ;
OU
b. DébutEvénement ≤ DébutRecherche ET FinEvénement ≥ DébutRecherche ET FinEvénement ≤ FinRecherche ;
OU
c. DébutEvénement ≥ DébutRecherche ET DébutEvénement ≤ FinRecherche ET FinEvénement ≥ DébutRecherche ET FinEvénement ≤ FinRecherche ;
OU
d. DébutEvénement ≥ DébutRecherche ET DébutEvénement ≤ FinRecherche ET FinEvénement ≥ FinRecherche.
Deux postulats à conserver, permettent de réduire ces écritures, ils sont basés sur un seul postulat « Début ≤ Fin », c’est-à-dire :
- La date de début de chaque événement (DébutEvénement) est antérieure ou égale à sa date de fin (FinEvénement) ;
- La date de début de la période de recherche (DébutRecherche) est antérieure ou égale à sa date de fin (FinRecherche).
Il est donc possible de récrire « a » de la manière suivante :
1) DébutEvénement ≤ DébutRecherche ET FinEvénement ≥ FinRecherche ;
Soit
2) DébutEvénement ≤ DébutRecherche ≤ FinRecherche ET FinEvénement ≥ FinRecherche ≥ DébutRecherche ;
Soit
3) DébutEvénement ≤ FinRecherche ET FinEvénement ≥ DébutRecherche.
Ceci est également vérifiable sur la frise chronologique précédente : le début de l’événement est antérieur à la fin de la recherche et la fin de l’événement est postérieur au début de la recherche.
Il est possible de réécrire « b » de la manière suivante :
1) DébutEvénement ≤ DébutRecherche ET FinEvénement ≥ DébutRecherche ET FinEvénement ≤ FinRecherche ;
Soit
2) DébutEvénement ≤ DébutRecherche ≤ FinRecherche ET FinEvénement ≥ DébutRecherche ET DébutEvénement ≤ FinEvénement ≤ FinRecherche ;
Soit
3) DébutEvénement ≤ FinRecherche ET FinEvénement ≥ DébutRecherche ET DébutEvénement ≤ FinRecherche
Soit (les conditions bleue et orange étant identiques)
4) DébutEvénement ≤ FinRecherche ET FinEvénement ≥ DébutRecherche.
Les expressions « a » et « b » peuvent donc se récrire de la même manière, elles sont ainsi identiques.
Il est possible de réécrire « c » de la manière suivante :
1) DébutEvénement ≥ DébutRecherche ET DébutEvénement ≤ FinRecherche ET FinEvénement ≥ DébutRecherche ET FinEvénement ≤ FinRecherche ;
Soit
2) FinEvénement ≥ DébutEvénement ≥ DébutRecherche ET DébutEvénement ≤ FinRecherche ET FinEvénement ≥ DébutRecherche ET DébutEvénement ≤ FinEvénement ≤ FinRecherche ;
Soit
3) FinEvénement ≥ DébutRecherche ET DébutEvénement ≤ FinRecherche ET FinEvénement ≥ DébutRecherche ET DébutEvénement ≤ FinRecherche ;
Soit (les conditions bleue et orange étant identiques et les conditions verte et ocre étant identiques)
4) FinEvénement ≥ DébutRecherche ET DébutEvénement ≤ FinRecherche.
Les expressions « a », « b » et « c » peuvent donc se récrire de la même manière, elles sont ainsi identiques.
Il est possible de réécrire « c » de la manière suivante :
1) DébutEvénement ≥ DébutRecherche ET DébutEvénement ≤ FinRecherche ET FinEvénement ≥ FinRecherche ;
Soit
2) FinEvénement ≥ DébutEvénement ≥ DébutRecherche ET DébutEvénement ≤ FinRecherche ET FinEvénement ≥ FinRecherche ≥ DébutRecherche ;
Soit
3) FinEvénement ≥ DébutRecherche ET DébutEvénement ≤ FinRecherche ET FinEvénement ≥ DébutRecherche ;
Soit (les conditions bleu et orange étant identiques)
4) FinEvénement ≥ DébutRecherche ET DébutEvénement ≤ FinRecherche.
Une dernière fois, les expressions « a », « b », « c » et « d » peuvent donc se récrire de la même manière, elles sont ainsi identiques.
Une seule expression exprime donc les 4 :
FinEvénement ≥ DébutRecherche ET DébutEvénement ≤ FinRecherche
Pour simplifier sa lecture et sa mémorisation, elle peut être réécrite :
DébutRecherche ≤ FinEvénement ET DébutEvénement ≤ FinRecherche
Moyen mnémotechnique : « début avant fin ET début avant fin ; et on croise les dates ».