
LAST_DAY Oracle : Obtenir le Dernier Jour du Mois en SQL
La fonction LAST_DAY en Oracle SQL est un outil incontournable pour toute manipulation de dates en entreprise. Elle permet de retourner instantanément le dernier jour du mois correspondant à une date donnée. Que vous gériez des échéances de facturation, des fins de période comptable ou des calculs de délais, LAST_DAY simplifie considérablement vos requêtes SQL Oracle au quotidien.
Définition et utilisation de LAST_DAY
La fonction LAST_DAY appartient à la famille des fonctions de date d’Oracle. Elle prend une date en entrée et retourne la date correspondant au dernier jour du mois de cette même date. Le résultat est toujours de type DATE, incluant la composante horaire héritée de la date passée en paramètre.
Cas d’usage courants en entreprise
- Clôture comptable : Déterminer automatiquement la fin d’une période mensuelle pour les écritures comptables.
- Facturation : Calculer la date limite de paiement d’une facture émise en cours de mois.
- Ressources humaines : Identifier le dernier jour du mois d’embauche d’un employé pour le calcul du prorata de salaire.
- Reporting : Filtrer les données jusqu’à la fin du mois en cours dans des tableaux de bord dynamiques.
- Gestion de contrats : Vérifier si un contrat expire en fin de mois pour déclencher des alertes automatiques.
La fonction tient naturellement compte des années bissextiles : pour le mois de février d’une année bissextile, elle retournera le 29 février sans aucune configuration supplémentaire.
Syntaxe de LAST_DAY
LAST_DAY( date )
Paramètres
| Paramètre | Type | Description | Obligatoire |
|---|---|---|---|
date | DATE | La date d’entrée à partir de laquelle le dernier jour du mois est calculé. Peut être une colonne, une expression ou un littéral de date. | Oui |
Valeur de retour : La fonction retourne une valeur de type DATE représentant le dernier jour du mois de la date fournie. L’heure, les minutes et les secondes sont conservées de la date d’origine.
Remarque importante : Si le paramètre date est NULL, la fonction retourne NULL. Il est conseillé d’utiliser NVL en amont si ce comportement n’est pas souhaité.
Exemples pratiques de LAST_DAY Oracle
Exemple 1 – Calcul de la fin de mois pour la facturation
Contexte métier : Une entreprise souhaite afficher, pour chaque facture émise, la date limite de paiement correspondant au dernier jour du mois d’émission.
-- Affichage des factures avec leur date limite de paiement (fin de mois)
SELECT
facture_id,
client_id,
date_emission,
LAST_DAY(date_emission) AS date_limite_paiement,
LAST_DAY(date_emission) - SYSDATE AS jours_restants
FROM
factures
WHERE
statut = 'EN_ATTENTE'
ORDER BY
date_emission;
Explication :
LAST_DAY(date_emission)calcule le dernier jour du mois pour chaque facture.- La soustraction
LAST_DAY(date_emission) - SYSDATEdonne le nombre de jours restants avant l’échéance, ce qui est directement exploitable pour des relances automatiques. SYSDATEest la fonction Oracle qui retourne la date et l’heure système actuelles.
Exemple 2 – Calcul du prorata de salaire pour les nouvelles embauches
Contexte métier : Le service RH doit calculer le prorata du salaire mensuel d’un employé embauché en cours de mois, en se basant sur le nombre de jours travaillés jusqu’à la fin du mois.
-- Calcul du prorata salarial pour les employés embauchés ce mois-ci
SELECT
e.employe_id,
e.nom || ' ' || e.prenom AS nom_complet,
e.date_embauche,
e.salaire_mensuel,
-- Nombre de jours travaillés jusqu'à la fin du mois d'embauche
LAST_DAY(e.date_embauche) - e.date_embauche + 1 AS jours_travailles,
-- Nombre total de jours dans le mois d'embauche
LAST_DAY(e.date_embauche) - TRUNC(e.date_embauche, 'MM') + 1 AS jours_total_mois,
-- Calcul du prorata
ROUND(
e.salaire_mensuel *
(LAST_DAY(e.date_embauche) - e.date_embauche + 1) /
(LAST_DAY(e.date_embauche) - TRUNC(e.date_embauche, 'MM') + 1),
2
) AS salaire_prorata
FROM
employes e
WHERE
TRUNC(e.date_embauche, 'MM') = TRUNC(SYSDATE, 'MM')
ORDER BY
e.date_embauche;
Explication :
LAST_DAY(e.date_embauche) - e.date_embauche + 1calcule le nombre de jours travaillés depuis la date d’embauche jusqu’à la fin du mois, en incluant le jour d’embauche.TRUNC(e.date_embauche, 'MM')tronque la date au premier jour du mois, permettant de calculer le nombre total de jours dans ce mois.ROUND(..., 2)arrondit le résultat à deux décimales pour un montant en euros propre.- La clause
WHEREfiltre uniquement les employés embauchés dans le mois courant.
Erreurs courantes avec LAST_DAY Oracle
Erreur : Passer une chaîne de caractères sans conversion explicite
Une erreur fréquente consiste à passer directement une chaîne de caractères à LAST_DAY sans conversion, en espérant qu’Oracle la convertisse automatiquement.
-- ❌ Requête incorrecte : dépendance au NLS_DATE_FORMAT de la session
SELECT LAST_DAY('15/07/2025') FROM DUAL;
-- ✅ Requête correcte : conversion explicite avec TO_DATE
SELECT LAST_DAY(TO_DATE('15/07/2025', 'DD/MM/YYYY')) FROM DUAL;
Explication de l’erreur : Oracle peut implicitement convertir une chaîne en date, mais ce comportement dépend du paramètre NLS_DATE_FORMAT de la session en cours. Si le format de la chaîne ne correspond pas au format NLS attendu, Oracle lève l’erreur ORA-01843 : mois non valide ou ORA-01858 : un caractère non numérique a été trouvé. Toujours utiliser TO_DATE avec un masque de format explicite garantit la portabilité et la fiabilité de votre requête, quel que soit l’environnement d’exécution.
Résumé
| Point clé | Détail |
|---|---|
| Fonction | LAST_DAY(date) |
| Retour | Type DATE – dernier jour du mois de la date fournie |
| Années bissextiles | Gérées automatiquement (retourne le 29/02 si applicable) |
| Valeur NULL | Retourne NULL si le paramètre est NULL |
| Compatibilité | Oracle Database (toutes versions courantes) |
| Erreur fréquente | Conversion implicite de chaîne → utiliser TO_DATE |
| Fonctions associées | TRUNC, ADD_MONTHS, SYSDATE, TO_DATE |
Bonnes pratiques Oracle
- Toujours combiner LAST_DAY avec TRUNC pour les comparaisons de plages de dates. Par exemple,
WHERE date_commande BETWEEN TRUNC(SYSDATE, 'MM') AND LAST_DAY(SYSDATE)garantit de couvrir l’intégralité du mois en cours, sans omission liée à la composante horaire. - Utiliser LAST_DAY dans les vues ou les requêtes de reporting pour rendre les filtres dynamiques. En évitant les dates codées en dur, vos requêtes s’adaptent automatiquement au mois courant, ce qui réduit la maintenance et les risques d’erreurs humaines lors des clôtures mensuelles.
Aller plus loin
Pour approfondir votre maîtrise des fonctions de dates en Oracle SQL, nous vous recommandons de consulter les cours suivants sur courssql.com :
- ADD_MONTHS Oracle : Ajouter ou soustraire des mois à une date – Apprenez à décaler des dates d’un nombre précis de mois, idéal pour calculer des échéances ou des périodes glissantes.
- TRUNC sur les dates Oracle : Tronquer une date au jour, mois ou année – Découvrez comment neutraliser la composante horaire d’une date ou la ramener au premier jour d’une période, un complément naturel à LAST_DAY.
- TO_DATE Oracle : Convertir une chaîne en date avec précision – Maîtrisez la conversion explicite de chaînes de caractères en dates pour sécuriser toutes vos requêtes manipulant des dates en Oracle.
