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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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
    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

+ 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