LAST_DAY Oracle : Fonction SQL pour les dates

Découvrez la fonction LAST_DAY en Oracle SQL : syntaxe, exemples pratiques et erreurs courantes pour maîtriser le dernier jour du mois.

Illustration du tutoriel SQL Oracle : LAST_DAY Oracle : Fonction SQL pour les dates

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.

Publicité

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ètreTypeDescriptionObligatoire
dateDATELa 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é.

Publicité

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) - SYSDATE donne le nombre de jours restants avant l’échéance, ce qui est directement exploitable pour des relances automatiques.
  • SYSDATE est 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 + 1 calcule 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 WHERE filtre 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
FonctionLAST_DAY(date)
RetourType DATE – dernier jour du mois de la date fournie
Années bissextilesGérées automatiquement (retourne le 29/02 si applicable)
Valeur NULLRetourne NULL si le paramètre est NULL
CompatibilitéOracle Database (toutes versions courantes)
Erreur fréquenteConversion implicite de chaîne → utiliser TO_DATE
Fonctions associéesTRUNC, ADD_MONTHS, SYSDATE, TO_DATE

Bonnes pratiques Oracle

  1. 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.
  2. 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 :

Publicité

Laisser un commentaire

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

Publicité