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

PL/SQL Oracle Discussion :

Différence de dates incompréhensible? [12c]


Sujet :

PL/SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2011
    Messages
    46
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 37
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Novembre 2011
    Messages : 46
    Par défaut Différence de dates incompréhensible?
    Bonjour,

    Je teste une requête pour calculer une différence de date en secondes par sqldevelopper :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
     
    select ((to_char(DATE1,'J')-to_char(to_date('01/01/1970','dd/mm/yyyy'),'J')) *    86400) + to_char(DATE1,'SSSSS') as TS1,to_char(DATE1,'DD/MM/YYYY HH24:MM:SS') as DATE1,
              ((to_char(DATE2,'J')-to_char(to_date('01/01/1970','dd/mm/yyyy'),'J')) *    86400) + to_char(DATE2,'SSSSS') as TS2,to_char(DATE2,'DD/MM/YYYY HH24:MM:SS') as DATE2, round((DATE1-DATE2)*86400) as DIFF  from MATABLE ;
    et j'ai des résultats "parfois" débiles... d'où ma tentative d'affichage en timestamp pour l'expliquer... ( dsl pour l'alignement)

    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
     
     
    TS1             	DATE1	                TS2            	DATE2	                DIFF
    1514881793	02/01/2018 08:01:53	1514881820	02/01/2018 08:01:20	-27
    1514881823	02/01/2018 08:01:23	1514881833	02/01/2018 08:01:33	-10
    1514881853	02/01/2018 08:01:53	1514881880	02/01/2018 08:01:20	-27
    1514881913	02/01/2018 08:01:53	1514881920	02/01/2018 08:01:00	-7
    1514881973	02/01/2018 08:01:53	1514882003	02/01/2018 08:01:23	-30
    1514882003	02/01/2018 08:01:23	1514882004	02/01/2018 08:01:24	-1
    1514882003	02/01/2018 08:01:23	1514882006	02/01/2018 08:01:26	-3
    1514882003	02/01/2018 08:01:23	1514882008	02/01/2018 08:01:28	-5
    1515582934	10/01/2018 11:01:34	1515582901	10/01/2018 11:01:01	33
    1515582930	10/01/2018 11:01:30	1515582894	10/01/2018 11:01:54	36
    1515592036	10/01/2018 13:01:16	1515592011	10/01/2018 13:01:51	25
    ....
    Le premier par exemple devrait donner une différence positive de 33 secondes mais il me donne -27 !
    Le 2eme fonctionne...
    Le 4eme a complètement bu ...
    etc...
    Certains fonctionnent et d'autre pas...

    Mais par contre si on fait l'opération sur les TS le résultat s'explique mieux ... mais les lignes 3/4/5 ont la même heure et pas le même TS...

    Un peu déboussolée la madame

    Est ce que ce serait un paramétrage de bdd que je connais pas qui ferait que mes dates n'ont pas la précision voulue pour faire des différences à la seconde?

    Merci pour votre aide

  2. #2
    Membre Expert
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Avril 2013
    Messages
    2 005
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2013
    Messages : 2 005
    Par défaut
    La manipulation des dates sous oracle est parfois délicate, bienvenu au club

    Je laisse les pros du SQL répondre mais déjà, faire un to_char - to_char, je ne le sens pas du tout.

    Sinon, ici, certainement de bonnes pistes : https://www.developpez.net/forums/d7...mbre-secondes/

  3. #3
    Membre averti
    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2011
    Messages
    46
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 37
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Novembre 2011
    Messages : 46
    Par défaut
    merci,
    L'affichage "pseudo timestamp" a été trouvé sur ce site.
    La différence en elle même s'implique pas de "to_char"
    j'ai déjà essayé le

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT   EXTRACT (SECOND FROM (date_fin - date_debut) DAY TO SECOND)
           + 60 * EXTRACT (MINUTE FROM (date_fin - date_debut) DAY TO SECOND)
           + 60 * 60 * EXTRACT (HOUR FROM (date_fin - date_debut) DAY TO SECOND)
      FROM ma_table
    Mais ce con me calcule toujours -27

  4. #4
    Membre Expert
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Avril 2013
    Messages
    2 005
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2013
    Messages : 2 005
    Par défaut
    Dans tes exemples en début de message, je vois que l'heure et la minute sont toujours égaux entre date1 et date2. Est-ce toujours vrai? Cela m'étonnerait mais dans ce cas on pourrait juste travailler sur EXTRACT SECONDE sans faire des additions et multiplications de minutes.

    Je teste un peu mais avec des chaines de caractères ça passe et le code est simple : c'est juste une soustraction entre deux dates, qui renvoit un nombre de jours et je multiplie pour avoir des secondes.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    select round((to_date('02/01/2018 08:01:53','DD/MM/YYYY HH24:MI:SS') - to_date('02/01/2018 08:01:20','DD/MM/YYYY HH24:MI:SS'))*(60*60*24),2) AS "Diff secondes" from dual;
    Diff secondes
    33
    J'ai fais aussi un test basique sur les dates, c'est OK aussi.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    select round((sysdate - (sysdate - 1))*(60*60*24),2) AS "Diff" from dual;
    Diff
    86400

  5. #5
    Membre averti
    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2011
    Messages
    46
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 37
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Novembre 2011
    Messages : 46
    Par défaut
    Non ce n'est pas forcément toujours le cas mais c'est commun que les dates soient séparées de quelques secondes donc "le plus souvent" les minutes sont les mêmes

    Je pense qu'il n'y a aucun souci avec la façon de fonctionner, si je reproduis tes requêtes ça marche... Et j'ai fait des milliers d'opérations sur les dates jusqu'à aujourd'hui sans problème mais dès que je m'adresse et mes objets DATE1 et DATE2 ça déconne... si je reprend mon exemple avec ton opération " basique"

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
     
    select round((DATE1- DATE2)*(60*60*24),2) AS "Diff" from MATABLE where [mon  exemple];
         Diff
    ----------
           -27
    C'est complètement ouf...
    c'est peut être dans la façon de faire l'insert au moment de remplir ma table qui fait qu'il arrondi son timestamp à la louche...
    Mais autant que je puisse en juger mon programme (en c++) insère bien les dates au format DD/MM/YYYY HH24:MI:SS

    C'est "à se coincer les parties dans une porte" comme dirait l'autre

  6. #6
    McM
    McM est déconnecté
    Expert confirmé

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Billets dans le blog
    4
    Par défaut
    donne le desc des colonnes de ta table, et fais un dump des dates
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select date1, dump(date1), to_char(date1, 'DD/MM/RRRR HH24:MI:SS')

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

Discussions similaires

  1. Différence de Date
    Par Poisson59 dans le forum MS SQL Server
    Réponses: 6
    Dernier message: 08/12/2006, 16h23
  2. différence entre date ?
    Par jessy212 dans le forum Oracle
    Réponses: 9
    Dernier message: 30/09/2006, 08h16
  3. Réponses: 1
    Dernier message: 23/06/2006, 19h10
  4. [SQL] Différence de dates
    Par fikou dans le forum Access
    Réponses: 14
    Dernier message: 07/06/2006, 13h41
  5. Fonction de différence de dates
    Par mr.t dans le forum Access
    Réponses: 12
    Dernier message: 21/02/2006, 17h54

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