ORACLE : détecter les chevauchements de périodes

Détecter les chevauchements de périodes dans une table (avec une date de début et une date de fin)

1. Travailler sur des données qui sont valables sur une période

On a souvent besoin de travailler sur des données qui sont valables sur une période, donc avec une date de début et de fin. Lors de l’intégration de ces données, il faut détecter le maximum d’incohérences éventuelles pour éviter que les problèmes surviennent plus loin dans la chaine et soient couteux et complexes à résoudre.

De même qu’on va de suite mettre en place des contraintes d’intégrité, par exemple d’unicité des données, dans le cas de ces données valables sur des périodes on va vérifier s’il n’y a pas de périodes qui se chevauchent.
(script TAB_UNIT création table et données)

Voici un extrait de la table :

Table TAB_UNIT

 

Ou on peut voir un chevauchement de date pour l’UNIT 42ZC entre la ligne sélectionnée et la ligne juste au dessus.

 

 

 

 

Si on cherche une valeur pour l’UNIT42Z au 20/12/2013 par exemple :

select *
from TAB_UNIT
where UNIT = 'UNIT42ZC'
and to_date('20/12/2013', 'DD/MM/YYYY') = DAT_DEB_VALIDITE
and (to_date('20/12/2013', 'DD/MM/YYYY')= DAT_FIN_VALIDITE or DAT_FIN_VALIDITE is NULL)
order by 2

On va trouver 2 valeurs différentes :Chevauchement dates - 2 valeurs différentes

 

 

 

2. Identifier les chevauchements de périodes

Voici donc une requête pour identifier la liste complète des chevauchements de périodes :

select *
from
(
select
UNIT
,DAT_DEB_VALIDITE
,DAT_FIN_VALIDITE
,LAG(DAT_DEB_VALIDITE) OVER (PARTITION BY UNIT ORDER BY DAT_DEB_VALIDITE) DAT_DEB_PREC
,LAG(DAT_FIN_VALIDITE) OVER (PARTITION BY UNIT ORDER BY DAT_DEB_VALIDITE) DAT_FIN_PREC
,LEAD(DAT_DEB_VALIDITE) OVER (PARTITION BY UNIT ORDER BY DAT_DEB_VALIDITE) DAT_DEB_SUIV
, LEAD(DAT_FIN_VALIDITE) OVER (PARTITION BY UNIT ORDER BY DAT_DEB_VALIDITE) DAT_FIN_SUIV
,case
when DAT_FIN_VALIDITE between LEAD(DAT_DEB_VALIDITE) OVER (PARTITION BY UNIT ORDER BY DAT_DEB_VALIDITE)
and LEAD(DAT_FIN_VALIDITE) OVER (PARTITION BY UNIT ORDER BY DAT_DEB_VALIDITE) then 1 else 0
end chevauchement
from  TAB_UNIT
) where CHEVAUCHEMENT=1

 

Et vous, quels sont vos contrôles initiaux lors de l’intégration des données ?

 

 

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *