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 04/11/2011, 09h40   #1
Futur Membre du Club
 
Inscription : septembre 2011
Messages : 51
Détails du profil
Informations forums :
Inscription : septembre 2011
Messages : 51
Points : 15
Points : 15
Par défaut Intervalle date en seconde

Bonjour,

Je stocke des dates dans une table en Timestamp(3).

J'aimerais avoir la différence en secondes.

Actuellement, je fais comme ceci :

Code :
1
2
3
4
5
6
SELECT round(
  extract(day FROM (max(date) - min(date)))*86400+
  extract(hour FROM (max(date) - min(date)))*3600+
  extract(minute FROM (max(date) - min(date)))*60+
  extract(second FROM (max(date) - min(date)))) "nb seconds"
FROM TABLE;
Y a-t-il un moyen plus simple pour arriver à ce résultat.

Merci d'avance
alex_972 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/11/2011, 10h56   #2
Membre Expert
 
Avatar de pacmann
 
Homme Pacman Pacman
Business analyst
Inscription : juin 2004
Messages : 1 417
Détails du profil
Informations personnelles :
Nom : Homme Pacman Pacman
Âge : 31
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Business analyst
Secteur : Finance

Informations forums :
Inscription : juin 2004
Messages : 1 417
Points : 2 309
Points : 2 309
Salut !

Tu veux faire très sale ?
Tu peux caster ton timestamp en date, faire la différence, multiplier par 24 * 3600
(mais je pense que t'y gagneras vraiment rien !)

Code :
1
2
3
4
5
6
 
SQL> SELECT (cast(current_timestamp AS date) - cast(current_timestamp - 1.45689752 AS date)) * 24 * 3600 FROM dual;
 
(CAST(CURRENT_TIMESTAMPASDATE)-CAST(CURRENT_TIMESTAMP-1.45689752ASDATE))*24*3600
--------------------------------------------------------------------------------
                                                                          125876
__________________

(c'est ma photo)
Paku, Paku !
Pour les jeunes incultes : non, je ne suis pas un pokémon...

Le pacblog : http://pacmann.over-blog.com/
pacmann est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/11/2011, 11h34   #3
Futur Membre du Club
 
Inscription : septembre 2011
Messages : 51
Détails du profil
Informations forums :
Inscription : septembre 2011
Messages : 51
Points : 15
Points : 15
Non merci

En fait, j'espérai secrètement être passé à coté d'une fonction magique !

Une fonction genre convert timestamp_to_second... snif
alex_972 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/11/2011, 11h59   #4
Modérateur
 
Homme Fabien
Ingénieur d'études en décisionnel
Inscription : septembre 2008
Messages : 5 686
Détails du profil
Informations personnelles :
Nom : Homme Fabien
Âge : 34
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Ingénieur d'études en décisionnel
Secteur : Arts - Culture

Informations forums :
Inscription : septembre 2008
Messages : 5 686
Points : 10 431
Points : 10 431
Envoyer un message via ICQ à Waldar Envoyer un message via Skype™ à Waldar
Citation:
Envoyé par pacmann Voir le message
Tu veux faire très sale ?
Tu peux caster ton timestamp en date, faire la différence, multiplier par 24 * 3600
Ce n'est pas si sale que ça, chez moi c'est le plus rapide :
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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
declare
    v$_time          pls_integer;
    v$_diff          pls_integer;
    v$_tsp1 constant timestamp(3) DEFAULT timestamp '2011-11-04 11:05:17.456';
    v$_tsp2 constant timestamp(3) DEFAULT timestamp '2011-10-30 18:32:02.123';
    v$_idts          interval day TO second;
    v$_loop constant pls_integer  DEFAULT 1e6;
 
begin
    v$_time := dbms_utility.get_time();
    FOR i IN 1..v$_loop
    loop
      v$_diff := (cast(v$_tsp1 AS date) - cast(v$_tsp2 AS date))*24*60*60;
    end loop;
    dbms_output.put_line('Methode Date     : ' || to_char(dbms_utility.get_time() - v$_time));
 
    v$_time := dbms_utility.get_time();
    FOR i IN 1..v$_loop
    loop
      v$_diff := extract(day    FROM v$_tsp1 - v$_tsp2)*24*60*60
               + extract(hour   FROM v$_tsp1 - v$_tsp2)*60*60
               + extract(minute FROM v$_tsp1 - v$_tsp2)*60
               + extract(second FROM v$_tsp1 - v$_tsp2);
    end loop;
    dbms_output.put_line('Methode Extract1 : ' || to_char(dbms_utility.get_time() - v$_time));
 
    v$_time := dbms_utility.get_time();
    FOR i IN 1..v$_loop
    loop
      v$_idts := v$_tsp1 - v$_tsp2;
      v$_diff := extract(day    FROM v$_idts)*24*60*60
               + extract(hour   FROM v$_idts)*60*60
               + extract(minute FROM v$_idts)*60
               + extract(second FROM v$_idts);
    end loop;
    dbms_output.put_line('Methode Extract2 : ' || to_char(dbms_utility.get_time() - v$_time));
end;
/
 
 
 
Methode Date     : 134
Methode Extract1 : 347
Methode Extract2 : 287
__________________
Email : http://scr.im/waldar
Waldar est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/11/2011, 13h38   #5
Membre Expert
 
Avatar de pacmann
 
Homme Pacman Pacman
Business analyst
Inscription : juin 2004
Messages : 1 417
Détails du profil
Informations personnelles :
Nom : Homme Pacman Pacman
Âge : 31
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Business analyst
Secteur : Finance

Informations forums :
Inscription : juin 2004
Messages : 1 417
Points : 2 309
Points : 2 309
Ah ben bonne nouvelle Waldar

Chuis toujours étonné par ton (bon) réflexe de comparer les temps d'exécution.

Cela dit, je parierait qu'Alex cherchait une écriture un peu plus compacte et jolie ?
(A propos, tu peux créer une fonction qui te retourne ça à la limite)
__________________

(c'est ma photo)
Paku, Paku !
Pour les jeunes incultes : non, je ne suis pas un pokémon...

Le pacblog : http://pacmann.over-blog.com/
pacmann est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/11/2011, 14h51   #6
Futur Membre du Club
 
Inscription : septembre 2011
Messages : 51
Détails du profil
Informations forums :
Inscription : septembre 2011
Messages : 51
Points : 15
Points : 15
Exactement pacmann.

Mais c'est bon à savoir Waldar, merci.
alex_972 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/11/2011, 15h02   #7
Modérateur
 
Homme Fabien
Ingénieur d'études en décisionnel
Inscription : septembre 2008
Messages : 5 686
Détails du profil
Informations personnelles :
Nom : Homme Fabien
Âge : 34
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Ingénieur d'études en décisionnel
Secteur : Arts - Culture

Informations forums :
Inscription : septembre 2008
Messages : 5 686
Points : 10 431
Points : 10 431
Envoyer un message via ICQ à Waldar Envoyer un message via Skype™ à Waldar
La voilà votre fonction !
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
CREATE OR REPLACE FUNCTION timestamp_to_second
  (
    p$_timestamp1 IN TIMESTAMP
  , p$_timestamp2 IN TIMESTAMP
  )
  RETURN INTEGER DETERMINISTIC
  IS 
BEGIN
  RETURN (floor((cast(p$_timestamp1 AS date) - cast(p$_timestamp2 AS date))*24*60*60));
END;
/
 
SELECT timestamp_to_second(timestamp '2011-11-04 11:05:17.456',
                           timestamp '2011-10-30 18:32:02.123') AS tts
  FROM dual;
 
       TTS
----------
    405195
__________________
Email : http://scr.im/waldar
Waldar est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/11/2011, 15h34   #8
Membre Expert
 
Avatar de pacmann
 
Homme Pacman Pacman
Business analyst
Inscription : juin 2004
Messages : 1 417
Détails du profil
Informations personnelles :
Nom : Homme Pacman Pacman
Âge : 31
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Business analyst
Secteur : Finance

Informations forums :
Inscription : juin 2004
Messages : 1 417
Points : 2 309
Points : 2 309
ca fait un peu long, mais j'aurais appelé la fonction timestamp_interval_to_second

Sinon, je sais pas si c'est utile le deterministic, à moins que ce ne soit tout le temps les même temps ?
(D'ailleurs, je trouve le fonctionnement moins clairement expliqué que le RESULT_CACHE sous 11g)

Je suppose qu'il doit stocker les associations paramètres / valeurs retournées...
__________________

(c'est ma photo)
Paku, Paku !
Pour les jeunes incultes : non, je ne suis pas un pokémon...

Le pacblog : http://pacmann.over-blog.com/
pacmann est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/11/2011, 16h26   #9
Expert Confirmé Sénior
 
Avatar de mnitu
 
Homme Marius Nitu
Ingénieur développement logiciels
Inscription : octobre 2007
Messages : 3 311
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 311
Points : 5 813
Points : 5 813
Après avoir trouvé environ une centaine des centièmes de second d’écart sur un million d’itérations maintenant vous jetez tout à la poubelle pour le plaisir d’appel d’une fonction PL/SQL soit –elle déterministe ?
mnitu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/11/2011, 16h36   #10
Expert Confirmé Sénior


 
Avatar de laurentschneider
 
Homme Laurent Schneider
Administrateur de base de données
Inscription : décembre 2005
Messages : 2 926
Détails du profil
Informations personnelles :
Nom : Homme Laurent Schneider
Localisation : Suisse

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

Informations forums :
Inscription : décembre 2005
Messages : 2 926
Points : 4 547
Points : 4 547
Citation:
Envoyé par alex_972 Voir le message
Y a-t-il un moyen plus simple pour arriver à ce résultat.
Non
__________________
Mon blog : laurentschneider.com
Mon livre : Advanced Oracle SQL Programming
laurentschneider est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/11/2011, 16h37   #11
Membre Expert
 
Avatar de pacmann
 
Homme Pacman Pacman
Business analyst
Inscription : juin 2004
Messages : 1 417
Détails du profil
Informations personnelles :
Nom : Homme Pacman Pacman
Âge : 31
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Business analyst
Secteur : Finance

Informations forums :
Inscription : juin 2004
Messages : 1 417
Points : 2 309
Points : 2 309
Il faut refaire des tests de perfs pour mesurer l'overhead de l'appel de la fonction à partir du SQL
__________________

(c'est ma photo)
Paku, Paku !
Pour les jeunes incultes : non, je ne suis pas un pokémon...

Le pacblog : http://pacmann.over-blog.com/
pacmann est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/11/2011, 16h52   #12
Modérateur
 
Homme Fabien
Ingénieur d'études en décisionnel
Inscription : septembre 2008
Messages : 5 686
Détails du profil
Informations personnelles :
Nom : Homme Fabien
Âge : 34
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Ingénieur d'études en décisionnel
Secteur : Arts - Culture

Informations forums :
Inscription : septembre 2008
Messages : 5 686
Points : 10 431
Points : 10 431
Envoyer un message via ICQ à Waldar Envoyer un message via Skype™ à Waldar
C'est un peu moins moins bon évidement :
Code :
1
2
3
4
5
6
7
-- À rajouter dans le bloc
    v$_time := dbms_utility.get_time();
    FOR i IN 1..v$_loop
    loop
      v$_diff := timestamp_to_second(v$_tsp1, v$_tsp2);
    end loop;
    dbms_output.put_line('Methode PL/SQL   : ' || to_char(dbms_utility.get_time() - v$_time));
Code :
1
2
3
4
Methode Date     : 142
Methode Extract1 : 338
Methode Extract2 : 290
Methode PL/SQL   : 258
__________________
Email : http://scr.im/waldar
Waldar est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/11/2011, 17h35   #13
Expert Confirmé Sénior


 
Avatar de laurentschneider
 
Homme Laurent Schneider
Administrateur de base de données
Inscription : décembre 2005
Messages : 2 926
Détails du profil
Informations personnelles :
Nom : Homme Laurent Schneider
Localisation : Suisse

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

Informations forums :
Inscription : décembre 2005
Messages : 2 926
Points : 4 547
Points : 4 547
bon, tu mesures le temps depuis plsql, alors que si tu devais employer ta fonction depuis sql, il y aurait un context switch.

à mon avis aucun intérêt d'écrire du plsql pour faire un extract


Code :
1
2
3
4
CREATE TABLE t AS 
SELECT timestamp '2000-01-01 00:00:00.000' + numtodsinterval(dbms_random.normal,'DAY') d 
FROM dual 
connect BY level<100000;
Code :
1
2
3
4
5
SQL> SELECT max(d),min(d) FROM t;
 
MAX(D)                          MIN(D)                         
------------------------------- -------------------------------
06-JAN-00 12.58.10.007070511 AM 27-DEC-99 01.45.00.412753923 PM
Code :
1
2
3
4
5
6
7
8
9
10
SQL> SELECT 
  extract(day FROM (max(d) - min(d)))*86400+
  extract(hour FROM (max(d) - min(d)))*3600+
  extract(minute FROM (max(d) - min(d)))*60+
  extract(second FROM (max(d) - min(d))) "nb seconds"
FROM T;
nb seconds
----------
817989.594
Elapsed: 00:00:00.04
Code :
1
2
3
4
5
SQL> SELECT timestamp_to_second(max(d),min(d)) "nb seconds" FROM t;
nb seconds
----------
    817989
Elapsed: 00:00:00.04

surtout quand extract fonctionne correctement
__________________
Mon blog : laurentschneider.com
Mon livre : Advanced Oracle SQL Programming
laurentschneider est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 04/11/2011, 18h15   #14
Membre Expert
 
Avatar de pacmann
 
Homme Pacman Pacman
Business analyst
Inscription : juin 2004
Messages : 1 417
Détails du profil
Informations personnelles :
Nom : Homme Pacman Pacman
Âge : 31
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Business analyst
Secteur : Finance

Informations forums :
Inscription : juin 2004
Messages : 1 417
Points : 2 309
Points : 2 309
J'aurais trouvé plus drôle de faire le test en enlevant le max pour cumuler les context switches (alors que là il n'y en a qu'un...).

Après, si ce morceau de code est utile, ça peut être sympa quand même la fonction, non ?
(Quand même laid et chiant avec tous ces multiplicateurs )
__________________

(c'est ma photo)
Paku, Paku !
Pour les jeunes incultes : non, je ne suis pas un pokémon...

Le pacblog : http://pacmann.over-blog.com/
pacmann est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/11/2011, 14h39   #15
Futur Membre du Club
 
Inscription : septembre 2011
Messages : 51
Détails du profil
Informations forums :
Inscription : septembre 2011
Messages : 51
Points : 15
Points : 15
Merci à tous pour vos réponses.

Pour le moment, je reste donc avec mes extracts
alex_972 est déconnecté   Envoyer un message privé Réponse avec citation 10
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 06h01.


 
 
 
 
Partenaires

Hébergement Web