SYSDATE Oracle SQL : date et heure courantes (syntaxe + exemples)

SYSDATE en Oracle SQL renvoie la date et l'heure du serveur. Syntaxe, formatage avec TO_CHAR, SYSDATE vs CURRENT_DATE et pièges du TRUNC.

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.

Publicité

🧪 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.

SYSDATE

Elle 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/26

Attention : 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:07

Exemples 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.

ExpressionSignification
SYSDATE + 1Demain, à la même heure
SYSDATE - 1Hier, à la même heure
SYSDATE + 1/24Dans une heure
SYSDATE + 1/1440Dans une minute
SYSDATE + 1/86400Dans une seconde
SYSDATE + 7Dans 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.

FonctionType renvoyéFuseau utiliséPrécision
SYSDATEDATEServeur de base de donnéesSeconde
CURRENT_DATEDATESession clienteSeconde
SYSTIMESTAMPTIMESTAMP WITH TIME ZONEServeur de base de donnéesFraction de seconde
LOCALTIMESTAMPTIMESTAMPSession clienteFraction 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:32

En 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).

Publicité

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 :

MasqueSignificationExemple
DDJour du mois (01-31)10
MMMois en chiffres (01-12)08
YYYYAnnée sur quatre chiffres2026
HH24Heure au format 24 h14
MIMinutes32
SSSecondes07
MonthNom du mois en toutes lettresAoût
DayNom du jourLundi
IWNuméro de semaine ISO33

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.

Sur le même thème

Un nouveau tutoriel SQL par semaine

Nous ne spammons pas ! Consultez notre politique de confidentialité pour plus d’informations.

Publicité

Laisser un commentaire

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

Cours SQL & Oracle — 100% gratuitVoir les cours →