
INTERVAL Oracle SQL : Gérer les intervalles de temps efficacement
Le type INTERVAL Oracle SQL est un objet puissant permettant de représenter et manipuler des durées ou des écarts entre deux points dans le temps. Que vous gériez des délais de livraison, des périodes d’abonnement ou des calculs de planification, maîtriser INTERVAL en Oracle est indispensable pour tout développeur SQL travaillant avec des données temporelles en entreprise.
Définition et utilisation de l’objet INTERVAL Oracle
En Oracle SQL, INTERVAL est un type de données natif qui stocke une durée, et non un instant précis dans le temps. Contrairement aux types DATE ou TIMESTAMP qui représentent un moment donné, INTERVAL exprime un écart temporel : « 3 jours », « 2 mois et 5 jours », « 4 heures 30 minutes », etc.
Oracle propose deux grandes familles d’intervalles :
- INTERVAL YEAR TO MONTH : pour les durées exprimées en années et/ou en mois.
- INTERVAL DAY TO SECOND : pour les durées exprimées en jours, heures, minutes et secondes (avec fractions de secondes possibles).
Cas d’usage en entreprise
- Gestion des contrats : calculer automatiquement la date d’échéance d’un contrat d’un an à partir de sa date de signature.
- Logistique : mesurer l’écart entre la date de commande et la date de livraison pour détecter les retards.
- Ressources humaines : calculer la durée de présence d’un employé dans l’entreprise en années et mois.
- Finance : calculer des pénalités de retard en fonction d’un nombre de jours de dépassement.
- Maintenance : planifier des révisions périodiques toutes les 6 heures ou tous les 3 mois.
Syntaxe complète d’INTERVAL Oracle SQL
INTERVAL YEAR TO MONTH
INTERVAL 'valeur' YEAR[(précision)] TO MONTH
INTERVAL 'valeur' YEAR[(précision)]
INTERVAL 'valeur' MONTH[(précision)]
- valeur : une chaîne littérale représentant la durée (ex. :
'2-6'pour 2 ans et 6 mois). - précision : nombre de chiffres pour la partie « année » (de 0 à 9, par défaut 2).
Exemples de littéraux valides :
INTERVAL '3' YEAR -- 3 ans
INTERVAL '6' MONTH -- 6 mois
INTERVAL '1-6' YEAR TO MONTH -- 1 an et 6 mois
INTERVAL DAY TO SECOND
INTERVAL 'valeur' DAY[(précision_jour)] TO SECOND[(précision_fraction)]
INTERVAL 'valeur' DAY[(précision_jour)]
INTERVAL 'valeur' HOUR
INTERVAL 'valeur' MINUTE
INTERVAL 'valeur' SECOND[(précision_fraction)]
- précision_jour : nombre de chiffres pour les jours (de 0 à 9, par défaut 2).
- précision_fraction : nombre de décimales pour les fractions de secondes (de 0 à 9, par défaut 6).
Exemples de littéraux valides :
INTERVAL '5' DAY -- 5 jours
INTERVAL '3 04:30:00' DAY TO SECOND -- 3 jours, 4 heures, 30 minutes
INTERVAL '02:30' HOUR TO MINUTE -- 2 heures et 30 minutes
INTERVAL '45' SECOND -- 45 secondes
Utilisation dans un calcul
Un INTERVAL peut être ajouté ou soustrait à un type DATE ou TIMESTAMP :
-- Ajouter 3 mois à une date
SELECT SYSDATE + INTERVAL '3' MONTH FROM DUAL;
-- Soustraire 2 jours et 6 heures à un timestamp
SELECT SYSTIMESTAMP - INTERVAL '2 06:00:00' DAY TO SECOND FROM DUAL;
Exemples pratiques d’INTERVAL Oracle SQL
Exemple 1 – Calcul de date d’échéance de contrat (contexte RH / Commercial)
Dans une table CONTRATS, chaque contrat possède une date de signature et une durée en mois. L’objectif est de calculer automatiquement la date de fin de contrat et d’afficher les contrats qui arrivent à échéance dans les 6 prochains mois.
-- Table de référence :
-- CONTRATS (ID_CONTRAT, CLIENT, DATE_SIGNATURE, DUREE_MOIS)
SELECT
ID_CONTRAT,
CLIENT,
DATE_SIGNATURE,
-- Calcul de la date de fin en ajoutant la durée en mois
DATE_SIGNATURE + NUMTOYMINTERVAL(DUREE_MOIS, 'MONTH') AS DATE_FIN,
-- Vérification si le contrat expire dans les 6 prochains mois
CASE
WHEN DATE_SIGNATURE + NUMTOYMINTERVAL(DUREE_MOIS, 'MONTH')
BETWEEN SYSDATE AND SYSDATE + INTERVAL '6' MONTH
THEN 'EXPIRATION PROCHE'
ELSE 'EN COURS'
END AS STATUT
FROM CONTRATS
ORDER BY DATE_FIN ASC;
Commentaires :
NUMTOYMINTERVAL(DUREE_MOIS, 'MONTH')convertit un nombre entier en unINTERVAL YEAR TO MONTH.- Le bloc
CASEcompare la date de fin avec une fenêtre de 6 mois à partir d’aujourd’hui grâce àINTERVAL '6' MONTH. - Ce type de requête est typiquement utilisé dans des tableaux de bord de gestion commerciale ou RH.
Exemple 2 – Mesure des délais de livraison (contexte Logistique)
Dans une table COMMANDES, on souhaite identifier les livraisons ayant dépassé le délai standard de 48 heures, et calculer le retard exact en heures et minutes.
-- Table de référence :
-- COMMANDES (ID_COMMANDE, DATE_COMMANDE, DATE_LIVRAISON, STATUT)
SELECT
ID_COMMANDE,
DATE_COMMANDE,
DATE_LIVRAISON,
-- Calcul de l'écart entre livraison et commande
(DATE_LIVRAISON - DATE_COMMANDE) AS DELAI_BRUT,
-- Conversion de l'écart en intervalle lisible (jours et heures)
NUMTODSINTERVAL(
(DATE_LIVRAISON - DATE_COMMANDE) * 24 * 3600, 'SECOND'
) AS DELAI_FORMATE,
-- Détection du dépassement du délai standard de 48h
CASE
WHEN DATE_LIVRAISON - DATE_COMMANDE > INTERVAL '2' DAY
THEN 'RETARD : ' || ROUND((DATE_LIVRAISON - DATE_COMMANDE - 2) * 24, 2) || 'h'
ELSE 'DANS LES DELAIS'
END AS ANALYSE
FROM COMMANDES
WHERE DATE_LIVRAISON IS NOT NULL
ORDER BY DELAI_BRUT DESC;
Commentaires :
- La soustraction de deux colonnes
DATEretourne un nombre de jours en Oracle (typeNUMBER). NUMTODSINTERVALpermet de convertir ce résultat en unINTERVAL DAY TO SECONDlisible.- La comparaison
> INTERVAL '2' DAYest directe et très lisible dans leCASE.
Erreurs courantes avec INTERVAL Oracle SQL
Erreur : mélange de familles INTERVAL incompatibles
Une erreur fréquente consiste à essayer d’additionner un INTERVAL YEAR TO MONTH avec un INTERVAL DAY TO SECOND. Oracle ne permet pas cette opération directement.
-- ❌ ERREUR : ORA-30081 - invalid data type for datetime/interval arithmetic
SELECT INTERVAL '1' YEAR + INTERVAL '10' DAY FROM DUAL;
Solution : appliquer les deux intervalles séparément sur la date cible :
-- ✅ CORRECT : on applique chaque intervalle successivement à une date
SELECT SYSDATE + INTERVAL '1' YEAR + INTERVAL '10' DAY FROM DUAL;
Cette approche fonctionne car Oracle additionne chaque INTERVAL à la date résultante de l’opération précédente, sans jamais combiner les deux intervalles entre eux.
Résumé des points clés sur INTERVAL Oracle SQL
| Élément | Détail |
|---|---|
| Type 1 | INTERVAL YEAR TO MONTH – durées en années/mois |
| Type 2 | INTERVAL DAY TO SECOND – durées en jours/heures/minutes/secondes |
| Ajout à une date | DATE + INTERVAL '...' UNIT |
| Conversion depuis NUMBER | NUMTOYMINTERVAL() et NUMTODSINTERVAL() |
| Restriction | Impossible de mélanger les deux familles dans une addition directe |
| Compatibilité | Fonctionne avec DATE et TIMESTAMP |
| Précision fractionnaire | Jusqu’à 9 décimales pour les secondes |
2 bonnes pratiques Oracle
- Préférez les littéraux INTERVAL aux calculs arithmétiques bruts : écrire
+ INTERVAL '1' MONTHest plus lisible, plus maintenable et moins sujet aux erreurs que d’ajouter30jours manuellement (tous les mois n’ont pas le même nombre de jours). - Utilisez
NUMTODSINTERVALetNUMTOYMINTERVALpour les valeurs dynamiques : lorsque la durée provient d’une colonne ou d’une variable, ces fonctions garantissent une conversion propre vers le bon type d’intervalle sans ambiguïté.
Aller plus loin avec Oracle SQL
Pour approfondir vos compétences sur la gestion des données temporelles et des calculs en Oracle SQL, nous vous recommandons les sujets suivants :
- Le type TIMESTAMP Oracle SQL : découvrez comment stocker des instants précis avec gestion des fuseaux horaires, et comment l’utiliser conjointement avec INTERVAL.
- Les fonctions de date Oracle SQL (SYSDATE, ADD_MONTHS, MONTHS_BETWEEN…) : maîtrisez l’ensemble des fonctions natives Oracle pour manipuler et formater les dates.
- NUMTODSINTERVAL et NUMTOYMINTERVAL Oracle SQL : apprenez à convertir des valeurs numériques en intervalles de manière dynamique pour des requêtes plus robustes et flexibles.
Sur le même thème
- PROCEDURE Oracle : Créer et Utiliser des Procédures PL/SQL
- Package Oracle PL/SQL : Guide complet et exemples
- Trigger Oracle SQL : Guide complet pour débutants
- SYNONYM Oracle : Alias d’Objets SQL Expliqué
- SEQUENCE Oracle SQL : Définition, Syntaxe et Exemples
- HAVING en SQL Oracle : filtrer les groupes efficacement
