La fonction SYSDATE en Oracle SQL renvoie la date et l’heure courantes du serveur de base de données. C’est la fonction la plus utilisée pour horodater une ligne, filtrer sur une période ou calculer une ancienneté. Contrairement à ce que son nom laisse penser, elle ne renvoie pas seulement une date : elle contient aussi les heures, minutes et secondes — et c’est la source de la majorité des erreurs qu’on rencontre avec elle.
🧪 Envie de pratiquer ? Exécutez les exemples de cet article dans notre SQL Playground gratuit — aucun logiciel à installer.
📌 À lire aussi : ADD_MONTHS : ajouter des mois à une date · Calculer la différence entre deux dates · EXTRACT : extraire l’année, le mois ou le jour
Syntaxe de SYSDATE en SQL Oracle
SYSDATE s’écrit sans parenthèses. C’est une particularité d’Oracle : la plupart des fonctions en exigent, celle-ci non.
SYSDATEElle ne prend aucun paramètre et renvoie une valeur de type DATE. Comme toute requête Oracle a besoin d’une table, on utilise la table système DUAL pour l’interroger seule :
SELECT SYSDATE FROM DUAL;Résultat (le format d’affichage dépend du paramètre NLS_DATE_FORMAT de votre session) :
SYSDATE
-----------
10/08/26Attention : l’affichage masque l’heure, mais elle est bien présente dans la valeur. Pour la voir, il faut demander un format explicite avec une conversion :
SELECT TO_CHAR(SYSDATE, 'DD/MM/YYYY HH24:MI:SS') AS maintenant FROM DUAL;MAINTENANT
-------------------
10/08/2026 14:32:07Exemples pratiques de SYSDATE
Horodater une insertion
L’usage le plus courant : enregistrer automatiquement la date de création d’une ligne.
INSERT INTO commandes (id_commande, id_client, date_commande)
VALUES (1001, 42, SYSDATE);On peut aussi le définir comme valeur par défaut de la colonne, ce qui évite de l’oublier :
CREATE TABLE commandes (
id_commande NUMBER PRIMARY KEY,
id_client NUMBER,
date_commande DATE DEFAULT SYSDATE NOT NULL
);Filtrer sur une période récente
Pour récupérer les commandes des trente derniers jours :
SELECT id_commande, date_commande
FROM commandes
WHERE date_commande >= SYSDATE - 30;En Oracle, soustraire un nombre à une date retire ce nombre de jours. C’est simple et lisible, mais il faut garder en tête que SYSDATE - 30 inclut l’heure : si nous sommes le 10 août à 14 h 32, la requête remonte au 11 juillet à 14 h 32, pas au 11 juillet à minuit.
Calculer une ancienneté
SELECT nom,
date_embauche,
TRUNC(MONTHS_BETWEEN(SYSDATE, date_embauche) / 12) AS annees_anciennete
FROM employes
ORDER BY annees_anciennete DESC;MONTHS_BETWEEN renvoie un nombre décimal de mois entre deux dates ; on divise par douze et on tronque pour obtenir des années entières.
Mettre à jour un champ de suivi
UPDATE commandes
SET statut = 'EXPEDIEE',
date_modification = SYSDATE
WHERE id_commande = 1001;Ajouter ou retirer du temps à SYSDATE
L’arithmétique des dates Oracle raisonne en jours. Toute fraction de journée s’exprime donc par une division.
| Expression | Signification |
|---|---|
SYSDATE + 1 | Demain, à la même heure |
SYSDATE - 1 | Hier, à la même heure |
SYSDATE + 1/24 | Dans une heure |
SYSDATE + 1/1440 | Dans une minute |
SYSDATE + 1/86400 | Dans une seconde |
SYSDATE + 7 | Dans une semaine |
Pour les mois et les années, n’utilisez pas SYSDATE + 30 : tous les mois n’ont pas trente jours. Oracle fournit ADD_MONTHS, qui gère correctement les fins de mois et les années bissextiles :
SELECT ADD_MONTHS(SYSDATE, 1) AS dans_un_mois,
ADD_MONTHS(SYSDATE, 12) AS dans_un_an,
ADD_MONTHS(SYSDATE, -3) AS il_y_a_trois_mois
FROM DUAL;Une alternative plus lisible passe par les intervalles :
SELECT SYSDATE + INTERVAL '2' HOUR AS dans_deux_heures,
SYSDATE + INTERVAL '10' DAY AS dans_dix_jours
FROM DUAL;SYSDATE, CURRENT_DATE, SYSTIMESTAMP : lequel choisir ?
Oracle propose plusieurs fonctions de date courante, et les confondre provoque des décalages horaires difficiles à diagnostiquer. La différence tient à deux critères : d’où vient l’heure et quelle précision elle offre.
| Fonction | Type renvoyé | Fuseau utilisé | Précision |
|---|---|---|---|
SYSDATE | DATE | Serveur de base de données | Seconde |
CURRENT_DATE | DATE | Session cliente | Seconde |
SYSTIMESTAMP | TIMESTAMP WITH TIME ZONE | Serveur de base de données | Fraction de seconde |
LOCALTIMESTAMP | TIMESTAMP | Session cliente | Fraction de seconde |
Le point à retenir : SYSDATE ignore le fuseau horaire de votre session. Il donne l’heure du système d’exploitation qui héberge la base. Si votre serveur est à Londres et votre application à Casablanca, SYSDATE et CURRENT_DATE ne renverront pas la même heure.
ALTER SESSION SET TIME_ZONE = '+04:00';
SELECT TO_CHAR(SYSDATE, 'HH24:MI') AS heure_serveur,
TO_CHAR(CURRENT_DATE, 'HH24:MI') AS heure_session
FROM DUAL;HEURE_SERVEUR HEURE_SESSION
------------- -------------
14:32 18:32En pratique : utilisez SYSDATE pour des traitements internes cohérents entre eux, et SYSTIMESTAMP dès que la précision infra-seconde ou la traçabilité du fuseau comptent (journaux d’audit, horodatage d’événements).
Formater SYSDATE avec TO_CHAR
Le format d’affichage par défaut dépend du paramètre NLS_DATE_FORMAT, qui varie d’une base à l’autre. Ne comptez jamais dessus dans du code destiné à durer : formatez explicitement.
SELECT TO_CHAR(SYSDATE, 'DD/MM/YYYY') AS date_fr,
TO_CHAR(SYSDATE, 'YYYY-MM-DD') AS format_iso,
TO_CHAR(SYSDATE, 'HH24:MI:SS') AS heure,
TO_CHAR(SYSDATE, 'Day DD Month YYYY',
'NLS_DATE_LANGUAGE=FRENCH') AS date_longue
FROM DUAL;Les principaux masques de format :
| Masque | Signification | Exemple |
|---|---|---|
DD | Jour du mois (01-31) | 10 |
MM | Mois en chiffres (01-12) | 08 |
YYYY | Année sur quatre chiffres | 2026 |
HH24 | Heure au format 24 h | 14 |
MI | Minutes | 32 |
SS | Secondes | 07 |
Month | Nom du mois en toutes lettres | Août |
Day | Nom du jour | Lundi |
IW | Numéro de semaine ISO | 33 |
Piège classique : MM désigne le mois, MI les minutes. Écrire 'HH24:MM' affiche l’heure suivie du mois — une erreur qui passe souvent inaperçue en relecture.
Erreurs fréquentes avec SYSDATE
1. Comparer une date avec l’égalité
C’est de loin l’erreur la plus courante. Cette requête ne renvoie presque jamais rien :
-- Ne fonctionne pas comme prévu
SELECT * FROM commandes WHERE date_commande = SYSDATE;Pourquoi ? Parce que SYSDATE contient l’heure à la seconde près. Il faudrait qu’une commande ait été enregistrée exactement à la même seconde. La solution consiste à neutraliser la partie horaire avec TRUNC :
-- Toutes les commandes d'aujourd'hui
SELECT * FROM commandes WHERE TRUNC(date_commande) = TRUNC(SYSDATE);2. Empêcher l’utilisation d’un index
La requête ci-dessus est correcte, mais appliquer TRUNC sur la colonne empêche Oracle d’utiliser un index classique sur date_commande. Sur une grande table, la différence de performance est considérable. Préférez un encadrement, qui laisse l’index travailler :
-- Version compatible avec un index
SELECT * FROM commandes
WHERE date_commande >= TRUNC(SYSDATE)
AND date_commande < TRUNC(SYSDATE) + 1;3. Confondre le fuseau du serveur et celui de l’utilisateur
Si votre application affiche des heures décalées, vérifiez d’abord si le code utilise SYSDATE (heure du serveur) alors qu’il devrait utiliser CURRENT_DATE ou SYSTIMESTAMP (heure de la session). Ce décalage passe inaperçu en développement quand le serveur et le poste sont dans le même fuseau, puis surgit en production.
4. Stocker une date sous forme de texte
-- À éviter absolument
INSERT INTO commandes (date_commande) VALUES (TO_CHAR(SYSDATE, 'DD/MM/YYYY'));Stocker une date dans une colonne VARCHAR2 rend impossibles les comparaisons chronologiques et les calculs. Conservez le type DATE en base, et ne formatez qu’au moment de l’affichage.
5. Oublier que SYSDATE est évalué une seule fois par requête
Dans une même instruction SQL, tous les appels à SYSDATE renvoient la même valeur, y compris sur un million de lignes. C’est généralement un avantage — la cohérence est garantie —, mais cela signifie qu’on ne peut pas s’en servir pour mesurer une durée d’exécution ligne par ligne.
Questions fréquentes
Quelle est la différence entre SYSDATE et CURRENT_DATE en Oracle ?
SYSDATE renvoie la date et l’heure du système d’exploitation qui héberge la base de données. CURRENT_DATE renvoie la date et l’heure dans le fuseau horaire de votre session cliente. Si le serveur et le client sont dans des fuseaux différents, les deux valeurs diffèrent. Utilisez SYSDATE pour des traitements internes, CURRENT_DATE quand l’heure doit correspondre à celle de l’utilisateur.
Comment afficher l’heure avec SYSDATE ?
L’heure est déjà contenue dans SYSDATE, mais le format d’affichage par défaut la masque souvent. Utilisez TO_CHAR(SYSDATE, 'DD/MM/YYYY HH24:MI:SS') pour la faire apparaître. Le masque HH24 donne l’heure sur 24 heures, MI les minutes et SS les secondes.
Comment récupérer uniquement la date sans l’heure ?
Appliquez TRUNC(SYSDATE) : la fonction ramène l’heure à minuit tout en conservant le type DATE. C’est la méthode recommandée pour comparer des jours entre eux, par exemple TRUNC(date_commande) = TRUNC(SYSDATE).
Peut-on modifier la valeur renvoyée par SYSDATE ?
Pas directement : SYSDATE lit l’horloge du serveur. Pour les tests, Oracle propose le paramètre FIXED_DATE, qui fige la valeur renvoyée à l’échelle de l’instance. C’est un réglage d’administration réservé aux environnements de développement — jamais en production.
