IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

SQL Oracle Discussion :

Intervalle date en seconde


Sujet :

SQL Oracle

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2011
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Septembre 2011
    Messages : 60
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  2. #2
    Membre Expert Avatar de pacmann
    Homme Profil pro
    Consulté Oracle
    Inscrit en
    Juin 2004
    Messages
    1 626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consulté Oracle
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 626
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2011
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Septembre 2011
    Messages : 60
    Par défaut
    Non merci

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

    Une fonction genre convert timestamp_to_second... snif

  4. #4
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  5. #5
    Membre Expert Avatar de pacmann
    Homme Profil pro
    Consulté Oracle
    Inscrit en
    Juin 2004
    Messages
    1 626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consulté Oracle
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 626
    Par défaut
    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)

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2011
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Septembre 2011
    Messages : 60
    Par défaut
    Exactement pacmann.

    Mais c'est bon à savoir Waldar, merci.

  7. #7
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par défaut
    La voilà votre fonction !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  8. #8
    Membre Expert Avatar de pacmann
    Homme Profil pro
    Consulté Oracle
    Inscrit en
    Juin 2004
    Messages
    1 626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consulté Oracle
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 626
    Par défaut
    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...

  9. #9
    Expert confirmé Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    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 : 5 611
    Par défaut
    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 ?

  10. #10
    Expert confirmé
    Avatar de laurentschneider
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2005
    Messages
    2 944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

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

    Informations forums :
    Inscription : Décembre 2005
    Messages : 2 944
    Par défaut
    Citation Envoyé par alex_972 Voir le message
    Y a-t-il un moyen plus simple pour arriver à ce résultat.
    Non

  11. #11
    Membre Expert Avatar de pacmann
    Homme Profil pro
    Consulté Oracle
    Inscrit en
    Juin 2004
    Messages
    1 626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consulté Oracle
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 626
    Par défaut
    Il faut refaire des tests de perfs pour mesurer l'overhead de l'appel de la fonction à partir du SQL

  12. #12
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par défaut
    C'est un peu moins moins bon évidement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Methode Date     : 142
    Methode Extract1 : 338
    Methode Extract2 : 290
    Methode PL/SQL   : 258

  13. #13
    Expert confirmé
    Avatar de laurentschneider
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2005
    Messages
    2 944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

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

    Informations forums :
    Inscription : Décembre 2005
    Messages : 2 944
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  14. #14
    Membre Expert Avatar de pacmann
    Homme Profil pro
    Consulté Oracle
    Inscrit en
    Juin 2004
    Messages
    1 626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consulté Oracle
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 626
    Par défaut
    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 )

  15. #15
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2011
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Septembre 2011
    Messages : 60
    Par défaut
    Merci à tous pour vos réponses.

    Pour le moment, je reste donc avec mes extracts

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Intervalle entre deux dates en secondes
    Par lllhuhdklll dans le forum PL/SQL
    Réponses: 11
    Dernier message: 11/11/2012, 12h58
  2. plusieurs intervalles dates
    Par grizzz dans le forum Langage SQL
    Réponses: 2
    Dernier message: 08/12/2006, 11h25
  3. Intervalle Date Sans Compter Les Week Ends
    Par datamind dans le forum Oracle
    Réponses: 6
    Dernier message: 05/05/2006, 18h14
  4. Réponses: 9
    Dernier message: 25/01/2006, 14h29
  5. convertir une date en seconde
    Par svil dans le forum Langage
    Réponses: 5
    Dernier message: 05/11/2005, 22h45

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo