
🧪 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 ZONEbasé sur le fuseau horaire de la session courante - SYSTIMESTAMP : retourne un
TIMESTAMP WITH TIME ZONEbasé sur le fuseau horaire du serveur de base de données - LOCALTIMESTAMP : retourne un
TIMESTAMPsans 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 :
SYSTIMESTAMPElle 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
0et9indiquant le nombre de chiffres de précision pour les fractions de secondes. La valeur par défaut est6(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:00Ce 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.
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 |
|---|---|
| Fonction | SYSTIMESTAMP |
| Type retourné | TIMESTAMP WITH TIME ZONE |
| Précision | Jusqu’à 9 chiffres de fractions de secondes (défaut : 6) |
| Fuseau horaire | Basé sur le serveur Oracle (pas sur la session) |
| Différence avec SYSDATE | SYSDATE : type DATE, pas de fractions ni de TZ |
| Différence avec CURRENT_TIMESTAMP | CURRENT_TIMESTAMP utilise le TZ de la session |
| Paramètre optionnel | Précision de 0 à 9 (ex. : SYSTIMESTAMP(3)) |
| Cas d’usage typiques | Audit, logs, mesure de performance, multi-TZ |
Deux bonnes pratiques Oracle
- Toujours stocker les timestamps avec le fuseau horaire : Utilisez le type
TIMESTAMP WITH TIME ZONEplutôt queDATEpour vos colonnes d’horodatage. Cela évite toute ambiguïté lors de migrations, de changements d’heure ou dans les applications distribuées à l’international. - Éviter les conversions implicites dans les prédicats WHERE : Lorsque vous filtrez sur une colonne
TIMESTAMP WITH TIME ZONE, comparez toujours avecSYSTIMESTAMP(et nonSYSDATE) 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 :
- La fonction SYSDATE Oracle : comprenez les différences fondamentales avec SYSTIMESTAMP et apprenez quand utiliser l’une ou l’autre dans vos requêtes.
- La fonction TO_CHAR pour les dates Oracle : maîtrisez le formatage des timestamps et des dates pour l’affichage et les exports, avec tous les masques de format disponibles.
- Le type de données INTERVAL en Oracle SQL : apprenez à effectuer des calculs d’intervalles précis entre deux timestamps et à manipuler des durées en jours, heures, minutes et secondes.
Sur le même thème
- INSTEAD OF TRIGGER Oracle : Guide Complet et Pratique
- FULL JOIN Oracle SQL : syntaxe, exemples et bonnes pratiques
- Les Verrous Oracle : Guide Complet pour Débutants
- TO_TIMESTAMP Oracle : convertir une chaîne en timestamp
- ALTER SESSION Oracle : modifier sa session SQL facilement
- NUMTODSINTERVAL Oracle : Convertir un nombre en intervalle
