
null
—
NUMTOYMINTERVAL Oracle : Maîtriser les Intervalles Année-Mois en SQL
La fonction NUMTOYMINTERVAL est une fonction SQL Oracle qui permet de convertir un nombre en un intervalle de type INTERVAL YEAR TO MONTH. Indispensable pour manipuler des durées exprimées en années ou en mois, NUMTOYMINTERVAL simplifie considérablement les calculs de dates dans les applications métier, notamment pour gérer des échéances, des contrats ou des abonnements.
🧪 Envie de pratiquer ? Exécutez les exemples de cet article dans notre SQL Playground gratuit — aucun logiciel à installer.
Définition et utilisation de NUMTOYMINTERVAL
La fonction NUMTOYMINTERVAL convertit une valeur numérique en un intervalle temporel de type INTERVAL YEAR TO MONTH. Elle appartient à la famille des fonctions de conversion de dates et d’intervalles d’Oracle, aux côtés de NUMTODSINTERVAL (qui gère les intervalles jour-seconde).
Cas d’usage en entreprise
Dans un contexte professionnel, cette fonction est particulièrement utile dans les situations suivantes :
- Gestion des contrats : calculer automatiquement une date d’expiration en ajoutant un nombre de mois ou d’années à une date de début.
- Abonnements et licences : déterminer la date de renouvellement d’un abonnement annuel ou trimestriel.
- Ressources humaines : calculer les dates d’anniversaire de poste, les fins de période d’essai ou les droits à congés.
- Comptabilité et finance : gérer des échéances de prêts ou des périodes fiscales.
Par rapport à la fonction ADD_MONTHS, NUMTOYMINTERVAL offre davantage de flexibilité car elle retourne un type de données INTERVAL, qui peut ensuite être stocké, comparé ou utilisé dans des opérations arithmétiques plus complexes.
Syntaxe de NUMTOYMINTERVAL
La syntaxe de la fonction est simple et ne comporte que deux paramètres :
NUMTOYMINTERVAL( n, 'interval_unit' )
Paramètres
| Paramètre | Type | Description |
|---|---|---|
n | NUMBER | La valeur numérique à convertir en intervalle. Peut être un entier ou un nombre décimal. |
interval_unit | VARCHAR2 | L’unité de l’intervalle. Accepte uniquement 'YEAR' ou 'MONTH' (insensible à la casse). |
Valeur retournée
La fonction retourne une valeur de type INTERVAL YEAR TO MONTH. Si le paramètre n est NULL, la fonction retourne NULL. La précision par défaut de l’année dans l’intervalle retourné est de 2 chiffres.
Unités acceptées
'YEAR'— convertit le nombre en années'MONTH'— convertit le nombre en mois
Attention : contrairement à NUMTODSINTERVAL, cette fonction n’accepte pas d’autres unités comme 'DAY', 'HOUR' ou 'SECOND'. Ces unités relèvent exclusivement de NUMTODSINTERVAL.
Exemples pratiques avec NUMTOYMINTERVAL
Exemple 1 — Calcul de date d’expiration d’un contrat
Contexte métier : une entreprise stocke dans une table CONTRATS la date de début et la durée (en mois) de chaque contrat. On souhaite calculer automatiquement la date d’expiration.
-- Table CONTRATS avec colonnes : ID_CONTRAT, CLIENT, DATE_DEBUT, DUREE_MOIS
-- Calcul de la date d'expiration en ajoutant DUREE_MOIS mois à DATE_DEBUT
SELECT
id_contrat,
client,
date_debut,
duree_mois,
date_debut + NUMTOYMINTERVAL(duree_mois, 'MONTH') AS date_expiration
FROM contrats
ORDER BY date_expiration;
Explication : Pour chaque contrat, la fonction NUMTOYMINTERVAL convertit la valeur numérique de la colonne DUREE_MOIS en un intervalle exprimé en mois. Cet intervalle est ensuite ajouté à DATE_DEBUT pour obtenir la date d’expiration précise. Le résultat est trié par ordre chronologique d’expiration.
Exemple 2 — Filtrer les contrats qui expirent dans moins de 2 ans
Contexte métier : le service commercial veut identifier tous les contrats actifs qui arrivent à expiration dans les 24 prochains mois, afin de lancer des actions de renouvellement proactives.
-- Identifier les contrats expirant dans les 24 prochains mois
-- On compare la date d'expiration avec la date actuelle + 2 ans
SELECT
id_contrat,
client,
date_debut,
date_debut + NUMTOYMINTERVAL(duree_mois, 'MONTH') AS date_expiration
FROM contrats
WHERE
-- Le contrat est encore actif (pas encore expiré)
date_debut + NUMTOYMINTERVAL(duree_mois, 'MONTH') >= SYSDATE
-- Et il expire dans moins de 2 ans
AND date_debut + NUMTOYMINTERVAL(duree_mois, 'MONTH') <= SYSDATE + NUMTOYMINTERVAL(2, 'YEAR')
ORDER BY date_expiration ASC;
Explication : Dans cet exemple, NUMTOYMINTERVAL est utilisé deux fois. D'abord pour calculer la date d'expiration de chaque contrat à partir de sa durée en mois, puis pour définir la borne supérieure du filtre (2 ans à partir d'aujourd'hui). Ce type de requête est très courant dans les tableaux de bord commerciaux ou les systèmes d'alertes automatisées.
Erreurs courantes avec NUMTOYMINTERVAL
Erreur : unité d'intervalle invalide
L'erreur la plus fréquente consiste à passer une unité non supportée par la fonction, comme 'DAY', 'HOUR' ou 'WEEK'.
-- ❌ INCORRECT : 'DAY' n'est pas une unité valide pour NUMTOYMINTERVAL
SELECT NUMTOYMINTERVAL(30, 'DAY') FROM DUAL;
-- Génère : ORA-01760: illegal argument for function
-- ✅ CORRECT : utiliser NUMTODSINTERVAL pour les unités jour/heure/minute/seconde
SELECT NUMTODSINTERVAL(30, 'DAY') FROM DUAL;
-- ✅ CORRECT : utiliser NUMTOYMINTERVAL uniquement avec 'YEAR' ou 'MONTH'
SELECT NUMTOYMINTERVAL(1, 'YEAR') FROM DUAL;
-- Résultat : +01-00 (1 an, 0 mois)
Règle à retenir : NUMTOYMINTERVAL = 'YEAR' ou 'MONTH' uniquement. Pour tout ce qui concerne les jours, heures, minutes ou secondes, utilisez NUMTODSINTERVAL.
Résumé
| Point clé | Détail |
|---|---|
| Fonction | NUMTOYMINTERVAL(n, 'unit') |
| Type retourné | INTERVAL YEAR TO MONTH |
| Unités valides | 'YEAR' et 'MONTH' uniquement |
| Valeur NULL | Retourne NULL si n est NULL |
| Compatibilité | Oracle 9i et versions supérieures |
| Fonction complémentaire | NUMTODSINTERVAL pour les intervalles jour-seconde |
| Usage principal | Arithmétique sur les dates (ajout/soustraction de périodes) |
Bonnes pratiques Oracle
- Préférez
NUMTOYMINTERVALàADD_MONTHSlorsque vous avez besoin de stocker ou comparer des intervalles : le typeINTERVAL YEAR TO MONTHest plus explicite et peut être directement stocké dans une colonne de type intervalle, ce qui améliore la lisibilité du modèle de données. - Testez toujours vos calculs d'intervalles sur
DUALavant de les intégrer dans une requête complexe : un simpleSELECT SYSDATE + NUMTOYMINTERVAL(6, 'MONTH') FROM DUAL;vous permet de vérifier rapidement le résultat attendu avant d'appliquer la logique à l'ensemble de vos données.
Aller plus loin
Pour approfondir votre maîtrise des fonctions de date et d'intervalle en SQL Oracle, voici trois sujets complémentaires qui vous permettront de gérer tous les cas de figure :
- La fonction NUMTODSINTERVAL : l'équivalent de NUMTOYMINTERVAL pour les intervalles exprimés en jours, heures, minutes et secondes. Indispensable pour les calculs de durée précis.
- La fonction ADD_MONTHS : une alternative plus simple pour ajouter un nombre fixe de mois à une date, idéale pour les cas où vous n'avez pas besoin du type INTERVAL.
- Le type de données INTERVAL en Oracle : comprendre les types
INTERVAL YEAR TO MONTHetINTERVAL DAY TO SECONDen profondeur pour modéliser correctement les durées dans vos tables.
Sur le même thème
- Clause WHERE en SQL Oracle – Filtrer vos données
- 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
- SEQUENCE Oracle SQL : Définition, Syntaxe et Exemples
- HAVING en SQL Oracle : filtrer les groupes efficacement
