7.3 Les données temporelles
179
© Dunod – La photocopie non autorisée est un délit.
Reprenons donc notre raisonnement : une ligne C de H_CLIENT et une ligne L de
H_LOCALITE sont en correspondance si leurs périodes de validité sont non
disjointes 9 , c'est à dire si 10
(L.debut < C.fin) et (C.debut < L.fin)
On peut écrire une première requête qui forme les couples de lignes de périodes de
validité non disjointes :
select C.NCLI,C.debut,C.fin,L.LOCALITE,L.debut,L.fin
from
H_CLIENT C, H_LOCALITE L
where C.LOCALITE = L.LOCALITE
and
(L.debut < C.fin) and (C.debut < L.fin)
Chacun des couples ainsi formés produit une ligne de la jointure dont la période de
validité est calculée comme suit :
[max(L.debut,C.debut),min(L.fin,C.fin)[
La jointure temporelle s'exprime donc comme suit en SQL 11 :
select C.NCLI,L.LOCALITE,
case
when L.debut > C.debut then L.debut
else C.debut
end,
case
when L.fin < C.fin then L.fin
else C.fin
end,
NOM,CAT,DELEGUE
from
H_CLIENT C, H_LOCALITE L
where C.LOCALITE = L.LOCALITE
and
(L.debut < C.fin) and (C.debut < L.fin)
et produit le résultat :
8. Si, comme on le suppose ici, les états successifs de chaque objet (clients et localités) sont jointifs, alors cette loi s’exprime d’une manière plus simple : pour toute ligne C de H_CLIENT,
il existe une ligne L1 de H_LOCALITE telle que L1.debut ≤ C.debut et il existe une ligne L2
de H_LOCALITE telle que C.fin ≤ L2.fin.
9. Notons que SQL propose un prédicat overlaps qui indique si deux périodes temporelles
contiennent des instants communs.
10. Cette relation s’obtient aisément lorsqu’on considère que les deux périodes sont disjointes ssi
C.fin ≤ L.debut ou C.debut ≥ L.fin. Elles sont donc non disjointes dans le cas contraire
(section 5.2.6, règle r13).
11. Si la fonction case n’est pas disponible, il faudra se résoudre à une formulation plus
complexe qui distingue quatre cas de recouvrement des intervalles. La requête prend alors la
forme d’une union de quatre requêtes SFW. Cette version est disponible sur le site Web de
l’ouvrage.
Précédent

- 179/436

Suivant