Précédent   Forum des professionnels en informatique > Bases de données > Oracle > SQL
SQL Forum d'entraide sur le SQL pour Oracle
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 16/09/2008, 13h46   #1
Membre émérite
 
Inscription : mars 2005
Messages : 1 065
Détails du profil
Informations personnelles :
Âge : 27

Informations forums :
Inscription : mars 2005
Messages : 1 065
Points : 898
Points : 898
Par défaut Intervalle en milli-secondes

Salut à tous.
Voila, je suis un peu une brèle en SQL, beaucoup en Oracle et je ne parviens pas à faire un bout de requête. J'aimerais savoir comment obtenir le nombre de milli-secondes séparant deux timestamp (par quelque moyen que ce soit).
Merci d'avance.

PS: oups, je viens de remarquer qu'il y a un sous-forum SQL pour Oracle, si un admin pouvait déplacer ce message...
zais_ethael est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/09/2008, 14h44   #2
Membre chevronné
 
Avatar de Z3phur
 
Homme loic
Administrateur de base de données
Inscription : décembre 2007
Messages : 673
Détails du profil
Informations personnelles :
Nom : Homme loic
Âge : 37
Localisation : France, Val de Marne (Île de France)

Informations professionnelles :
Activité : Administrateur de base de données
Secteur : Industrie

Informations forums :
Inscription : décembre 2007
Messages : 673
Points : 773
Points : 773
Salut, tes timestamp tu les récupères comment?
Z3phur est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/09/2008, 14h48   #3
Membre chevronné
 
Avatar de Z3phur
 
Homme loic
Administrateur de base de données
Inscription : décembre 2007
Messages : 673
Détails du profil
Informations personnelles :
Nom : Homme loic
Âge : 37
Localisation : France, Val de Marne (Île de France)

Informations professionnelles :
Activité : Administrateur de base de données
Secteur : Industrie

Informations forums :
Inscription : décembre 2007
Messages : 673
Points : 773
Points : 773
Si tu veux comparer deux dates et avoir le résultat en milli seconde fait comme ceci :


Code :
1
2
SELECT (to_date('16/09/2008 14:30:00','DD/MM/YYYY HH24:MI:SS') - to_date('16/09/2008 14:25:00','DD/MM/YYYY HH24:MI:SS'))*24*3600*1000
FROM dual

*24 donne en jour
*3600 donne en seconde
*1000 donne en milli-seconde
Z3phur est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/09/2008, 14h52   #4
Membre chevronné
 
Avatar de Z3phur
 
Homme loic
Administrateur de base de données
Inscription : décembre 2007
Messages : 673
Détails du profil
Informations personnelles :
Nom : Homme loic
Âge : 37
Localisation : France, Val de Marne (Île de France)

Informations professionnelles :
Activité : Administrateur de base de données
Secteur : Industrie

Informations forums :
Inscription : décembre 2007
Messages : 673
Points : 773
Points : 773
Et si je n'ai pas répondu à ta question le lien suivant peut peut être t'aider

ici
Z3phur est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/09/2008, 17h50   #5
Membre émérite
 
Inscription : mars 2005
Messages : 1 065
Détails du profil
Informations personnelles :
Âge : 27

Informations forums :
Inscription : mars 2005
Messages : 1 065
Points : 898
Points : 898
En fait c'est déjà résolu . Mais comme ça peut éventuellement servir à d'autre je donne une solution.

Ta solution ne semble pas fonctionner avec des timestamp. La soustraction de deux timestamp donne un type interval day to second (depuis oracle 9 seulement je pense), chose qu'il est ridiculement difficile de convertir en nombre. La seule méthode que j'ai trouvé est barbare mais d'après tout ce que j'ai pu lire il n'y a que ça, ça consiste à utiliser cette fonction:
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
CREATE OR REPLACE
FUNCTION interval_to_seconds(x INTERVAL DAY TO SECOND ) RETURN NUMBER IS
s VARCHAR2(26);
days_s VARCHAR2(26);
time_s VARCHAR2(26);
days number;
hours number;
minutes number;
seconds NUMBER;
N NUMBER;
BEGIN
  s := TO_CHAR(x);
  days_s := SUBSTR(s,2,INSTR(s,' ')-2);
  time_s := SUBSTR(s,2+LENGTH(days_s)+1);
  days := TO_NUMBER(days_s);
  hours := TO_NUMBER(SUBSTR(time_s,1,2));
  minutes := TO_NUMBER(SUBSTR(time_s,4,2));
  seconds := TO_NUMBER(SUBSTR(time_s,7),'99.999999');
 
  N := 86400*days + 3600*hours + 60*minutes + seconds;
  IF SUBSTR(s,1,1) = '-' THEN
     N := - N; 
  END IF;
  RETURN N; 
END;
zais_ethael est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/09/2008, 20h39   #6
Rédacteur/Modérateur
 
Avatar de Vincent Rogier
 
vincent rogier
Inscription : juillet 2007
Messages : 2 355
Détails du profil
Informations personnelles :
Nom : vincent rogier
Âge : 34

Informations forums :
Inscription : juillet 2007
Messages : 2 355
Points : 3 108
Points : 3 108
Le type Oracle "DATE" ne gère pas les millisecondes ! Donc le code donnée aura une précision limité à la seconde.

Citation:
Envoyé par Z3phur Voir le message
Si tu veux comparer deux dates et avoir le résultat en milli seconde fait comme ceci :


Code :
1
2
SELECT (to_date('16/09/2008 14:30:00','DD/MM/YYYY HH24:MI:SS') - to_date('16/09/2008 14:25:00','DD/MM/YYYY HH24:MI:SS'))*24*3600*1000
FROM dual
*24 donne en jour
*3600 donne en seconde
*1000 donne en milli-seconde
__________________
Vincent Rogier.

Rubrique ORACLE : Accueil - Forum - Tutoriels - FAQ - Livres - Blog

Vous voulez contribuer à la rubrique Oracle ? Contactez la rubrique !

OCILIB (C Driver for Oracle)

Librairie C Open Source multi-plateformes pour accéder et manipuler des bases de données Oracle
Vincent Rogier est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/09/2008, 23h34   #7
Membre chevronné
 
Avatar de Z3phur
 
Homme loic
Administrateur de base de données
Inscription : décembre 2007
Messages : 673
Détails du profil
Informations personnelles :
Nom : Homme loic
Âge : 37
Localisation : France, Val de Marne (Île de France)

Informations professionnelles :
Activité : Administrateur de base de données
Secteur : Industrie

Informations forums :
Inscription : décembre 2007
Messages : 673
Points : 773
Points : 773
Merci pour la précision
Z3phur est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/09/2008, 11h33   #8
McM
Expert Confirmé Sénior
 
Inscription : juillet 2003
Messages : 3 459
Détails du profil
Informations forums :
Inscription : juillet 2003
Messages : 3 459
Points : 4 226
Points : 4 226
On peut avoir une précision au 1/100 ème de seconde par
Code :
1
2
3
4
v1 := DBMS_UTILITY.GET_TIME;
...
v2 := DBMS_UTILITY.GET_TIME;
DBMS_OUTPUT.PUT_LINE( (v2-v1)); -- donne le nb de 1/100s
__________________
More Code : More Bugs. Less Code : Less Bugs
McM est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/09/2008, 11h55   #9
Rédacteur/Modérateur
 
Avatar de Vincent Rogier
 
vincent rogier
Inscription : juillet 2007
Messages : 2 355
Détails du profil
Informations personnelles :
Nom : vincent rogier
Âge : 34

Informations forums :
Inscription : juillet 2007
Messages : 2 355
Points : 3 108
Points : 3 108
Le but est de partir de 2 timestamp !

Le plus simple est d'utiliser l'expression suivante (t1 et t2 sont 2 timestamp) :

Code :
(extract(second FROM (t2-t1) * 1000)
Exemple :


Code :
1
2
3
4
5
SQL> SELECT (extract (second FROM ((systimestamp + 0.005)- systimestamp)) * 1000) AS "MS" FROM dual;
 
        MS
----------
     11212
__________________
Vincent Rogier.

Rubrique ORACLE : Accueil - Forum - Tutoriels - FAQ - Livres - Blog

Vous voulez contribuer à la rubrique Oracle ? Contactez la rubrique !

OCILIB (C Driver for Oracle)

Librairie C Open Source multi-plateformes pour accéder et manipuler des bases de données Oracle
Vincent Rogier est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/09/2008, 12h06   #10
Expert Confirmé Sénior
 
Avatar de mnitu
 
Homme Marius Nitu
Ingénieur développement logiciels
Inscription : octobre 2007
Messages : 3 320
Détails du profil
Informations personnelles :
Nom : Homme Marius Nitu
Localisation : France, Marne (Champagne Ardenne)

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : octobre 2007
Messages : 3 320
Points : 5 839
Points : 5 839
Code :
1
2
3
4
5
6
7
8
 
SQL> SELECT extract(second FROM systimestamp - TO_TIMESTAMP ('18/09/08 11:53:54,257726', 'YYYY-MM-DD HH:MI:SS.FF6'))
  2    FROM t_tst
  3  ;
 
EXTRACT(SECONDFROMSYSTIMESTAMP
------------------------------
                     26,369946
mnitu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/09/2008, 14h39   #11
Membre émérite
 
Inscription : mars 2005
Messages : 1 065
Détails du profil
Informations personnelles :
Âge : 27

Informations forums :
Inscription : mars 2005
Messages : 1 065
Points : 898
Points : 898
J'ai bien spécifié dans mon premier message que j'utilisais des timestamp, donc ça règle le problème.
Néanmoins vicenzo, ta logique est erronée, dans ce cas ci la fonction extract va extraire la partie "secondes" qui serait affichée lors d'une conversion de l'intervalle en texte, ce n'est pas du tout correct.
Exemple: Il y a 75 secondes qui séparent 00:00:00 et 00:01:15, mais extract(seconds from (00:01:15-00:00:00)) donnera 15 (car l'intervalle vaut 1 minute et 15 secondes).
zais_ethael est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/09/2008, 16h40   #12
Expert Confirmé Sénior
 
Avatar de mnitu
 
Homme Marius Nitu
Ingénieur développement logiciels
Inscription : octobre 2007
Messages : 3 320
Détails du profil
Informations personnelles :
Nom : Homme Marius Nitu
Localisation : France, Marne (Champagne Ardenne)

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : octobre 2007
Messages : 3 320
Points : 5 839
Points : 5 839
Citation:
Envoyé par zais_ethael Voir le message
J'ai bien spécifié dans mon premier message que j'utilisais des timestamp, donc ça règle le problème.
Néanmoins vicenzo, ta logique est erronée, dans ce cas ci la fonction extract va extraire la partie "secondes" qui serait affichée lors d'une conversion de l'intervalle en texte, ce n'est pas du tout correct.
Exemple: Il y a 75 secondes qui séparent 00:00:00 et 00:01:15, mais extract(seconds from (00:01:15-00:00:00)) donnera 15 (car l'intervalle vaut 1 minute et 15 secondes).
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
 
SQL> WITH TabInt AS (
  2    SELECT systimestamp - TO_TIMESTAMP ('18/09/08 11:53:54,257726', 'YYYY-MM-DD HH:MI:SS.FF6') tint
  3      FROM dual
  4  )
  5  SELECT extract(hour FROM tint) deltah,
  6         extract(minute FROM tint) deltam,
  7         extract(second FROM tint) deltaS
  8    FROM TabInt
  9  ;
 
    DELTAH     DELTAM     DELTAS
---------- ---------- ----------
         4         47  50,411809
mnitu est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 05h49.


 
 
 
 
Partenaires

Hébergement Web