SYSTIMESTAMP Oracle : Guide Complet avec Exemples SQL

Découvrez SYSTIMESTAMP dans Oracle SQL : définition, syntaxe, exemples pratiques et erreurs courantes. Maîtrisez la gestion des timestamps avec fuseau horaire.

Illustration du tutoriel SQL Oracle : SYSTIMESTAMP Oracle : Guide Complet avec Exemples SQL

Publicité

🧪 Envie de pratiquer ? Exécutez les exemples de cet article dans notre SQL Playground gratuit — aucun logiciel à installer.

SYSTIMESTAMP Oracle : Tout Savoir sur cette Fonction de Date et Heure

La fonction SYSTIMESTAMP est l’une des fonctions temporelles les plus puissantes du langage SQL Oracle. Elle permet de récupérer la date et l’heure exactes du système de base de données, accompagnées des fractions de secondes et du fuseau horaire. Que vous travailliez sur des audits, des journaux d’événements ou des calculs de durée précis, SYSTIMESTAMP s’impose comme un outil incontournable pour tout développeur ou DBA Oracle.

Définition et utilisation de SYSTIMESTAMP

La fonction SYSTIMESTAMP retourne la date et l’heure courantes du serveur de base de données Oracle sous la forme d’un type de données TIMESTAMP WITH TIME ZONE. Contrairement à SYSDATE qui ne retourne que la date et l’heure sans fractions de secondes ni information de fuseau horaire, SYSTIMESTAMP offre une précision à la microseconde près et intègre le décalage horaire (offset) du serveur.

Différences clés avec les autres fonctions temporelles Oracle

  • SYSDATE : retourne un type DATE (sans fractions de secondes, sans fuseau horaire)
  • CURRENT_TIMESTAMP : retourne un TIMESTAMP WITH TIME ZONE basé sur le fuseau horaire de la session courante
  • SYSTIMESTAMP : retourne un TIMESTAMP WITH TIME ZONE basé sur le fuseau horaire du serveur de base de données
  • LOCALTIMESTAMP : retourne un TIMESTAMP sans fuseau horaire, calé sur la session

Cas d’usage en entreprise

Dans un contexte professionnel, SYSTIMESTAMP est particulièrement utile dans les scénarios suivants :

  • Audit et traçabilité : horodatage précis des insertions, modifications ou suppressions dans les tables de log
  • Applications multi-fuseaux horaires : suivi d’événements dans des systèmes distribués à l’international
  • Calcul de durées précises : mesure des performances d’un traitement ou d’un batch
  • Compliance et réglementation : conservation d’une trace horodatée fiable pour des obligations légales (RGPD, SOX, etc.)

Syntaxe de SYSTIMESTAMP

La syntaxe de SYSTIMESTAMP est volontairement simple, car il s’agit d’une fonction sans paramètre :

SYSTIMESTAMP

Elle peut également s’écrire avec une précision optionnelle sur les fractions de secondes :

SYSTIMESTAMP(précision)

Paramètre :

  • précision (optionnel) : un entier compris entre 0 et 9 indiquant le nombre de chiffres de précision pour les fractions de secondes. La valeur par défaut est 6 (microsecondes). Par exemple, SYSTIMESTAMP(3) retourne une précision en millisecondes.

Type de retour : TIMESTAMP WITH TIME ZONE

Exemple du format de sortie typique :

25-JUN-25 14.37.52.847291000 +02:00

Ce résultat contient : la date (25-JUN-25), l’heure (14.37.52), les fractions de secondes (847291000) et le décalage par rapport à UTC (+02:00).

Exemples pratiques avec SYSTIMESTAMP

Exemple 1 – Horodatage d’un événement dans une table d’audit

Contexte métier : Une entreprise de e-commerce souhaite enregistrer précisément chaque modification de prix d’un produit dans une table d’historique, avec l’heure exacte et le fuseau horaire du serveur.


-- Création d'une table d'audit des modifications de prix
CREATE TABLE audit_prix (
    id_audit       NUMBER GENERATED ALWAYS AS IDENTITY,
    id_produit     NUMBER         NOT NULL,
    ancien_prix    NUMBER(10, 2)  NOT NULL,
    nouveau_prix   NUMBER(10, 2)  NOT NULL,
    date_modif     TIMESTAMP WITH TIME ZONE DEFAULT SYSTIMESTAMP,
    utilisateur    VARCHAR2(50)   DEFAULT USER
);

-- Insertion d'un enregistrement d'audit lors d'un changement de prix
INSERT INTO audit_prix (id_produit, ancien_prix, nouveau_prix)
VALUES (1042, 29.99, 24.99);

-- Consultation des dernières modifications
SELECT
    id_audit,
    id_produit,
    ancien_prix,
    nouveau_prix,
    TO_CHAR(date_modif, 'DD/MM/YYYY HH24:MI:SS.FF3 TZH:TZM') AS horodatage,
    utilisateur
FROM audit_prix
ORDER BY date_modif DESC;

Explication : La colonne date_modif utilise SYSTIMESTAMP comme valeur par défaut. Cela garantit que chaque ligne insérée est automatiquement horodatée avec la précision complète du serveur. La fonction TO_CHAR avec le format FF3 affiche les millisecondes, et TZH:TZM affiche le décalage horaire.

Exemple 2 – Mesure de la durée d’exécution d’un traitement

Contexte métier : Un DBA d’une banque souhaite mesurer précisément la durée d’un traitement de calcul des intérêts mensuels pour évaluer les performances du batch.


DECLARE
    v_debut    TIMESTAMP WITH TIME ZONE;
    v_fin      TIMESTAMP WITH TIME ZONE;
    v_duree    INTERVAL DAY TO SECOND;
    v_nb_lignes NUMBER;
BEGIN
    -- Capture du timestamp de début
    v_debut := SYSTIMESTAMP;

    -- Simulation d'un traitement (mise à jour des soldes)
    UPDATE comptes_clients
    SET solde = solde + (solde * taux_interet / 12)
    WHERE statut = 'ACTIF';

    v_nb_lignes := SQL%ROWCOUNT;

    -- Capture du timestamp de fin
    v_fin := SYSTIMESTAMP;

    -- Calcul de la durée exacte
    v_duree := v_fin - v_debut;

    -- Affichage du rapport de performance
    DBMS_OUTPUT.PUT_LINE('Traitement terminé.');
    DBMS_OUTPUT.PUT_LINE('Lignes mises à jour : ' || v_nb_lignes);
    DBMS_OUTPUT.PUT_LINE('Durée : ' || v_duree);
    DBMS_OUTPUT.PUT_LINE('Début : ' || TO_CHAR(v_debut, 'HH24:MI:SS.FF6'));
    DBMS_OUTPUT.PUT_LINE('Fin   : ' || TO_CHAR(v_fin,   'HH24:MI:SS.FF6'));

    COMMIT;
END;
/

Explication : En capturant SYSTIMESTAMP avant et après le traitement, on obtient un intervalle de type INTERVAL DAY TO SECOND par simple soustraction. La précision à 6 chiffres (FF6) permet une mesure fiable même pour des traitements très courts.

Publicité

Erreurs courantes avec SYSTIMESTAMP

Erreur : confusion entre SYSTIMESTAMP et SYSDATE lors d’une comparaison

Une erreur fréquente consiste à comparer directement une colonne de type TIMESTAMP WITH TIME ZONE avec SYSDATE, ce qui peut provoquer des conversions implicites inattendues et des résultats incorrects.

Code problématique :


-- ❌ Comparaison incorrecte : mélange de types DATE et TIMESTAMP
SELECT * FROM audit_prix
WHERE date_modif > SYSDATE - 1;

Solution recommandée :


-- ✅ Utilisation cohérente de SYSTIMESTAMP pour la comparaison
SELECT * FROM audit_prix
WHERE date_modif > SYSTIMESTAMP - INTERVAL '1' DAY;

-- ✅ Ou avec CAST si vous avez besoin de comparer avec un type DATE
SELECT * FROM audit_prix
WHERE CAST(date_modif AS DATE) > SYSDATE - 1;

En utilisant SYSTIMESTAMP avec un INTERVAL ou en castant explicitement les types, vous évitez les conversions implicites silencieuses qui peuvent fausser vos requêtes et impacter les performances (invalidation d’index).

Résumé

Point cléDétail
FonctionSYSTIMESTAMP
Type retournéTIMESTAMP WITH TIME ZONE
PrécisionJusqu’à 9 chiffres de fractions de secondes (défaut : 6)
Fuseau horaireBasé sur le serveur Oracle (pas sur la session)
Différence avec SYSDATESYSDATE : type DATE, pas de fractions ni de TZ
Différence avec CURRENT_TIMESTAMPCURRENT_TIMESTAMP utilise le TZ de la session
Paramètre optionnelPrécision de 0 à 9 (ex. : SYSTIMESTAMP(3))
Cas d’usage typiquesAudit, logs, mesure de performance, multi-TZ

Deux bonnes pratiques Oracle

  1. Toujours stocker les timestamps avec le fuseau horaire : Utilisez le type TIMESTAMP WITH TIME ZONE plutôt que DATE pour vos colonnes d’horodatage. Cela évite toute ambiguïté lors de migrations, de changements d’heure ou dans les applications distribuées à l’international.
  2. Éviter les conversions implicites dans les prédicats WHERE : Lorsque vous filtrez sur une colonne TIMESTAMP WITH TIME ZONE, comparez toujours avec SYSTIMESTAMP (et non SYSDATE) pour garantir la cohérence des types et permettre à l’optimiseur Oracle d’utiliser correctement les index.

Aller plus loin

Pour approfondir votre maîtrise de la gestion des dates et des heures dans Oracle SQL, voici trois sujets complémentaires qui vous permettront de tirer le meilleur parti de vos requêtes temporelles :

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 *

Publicité