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 :

Dégradation de la précision Timestamp avec Decode


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 Dégradation de la précision Timestamp avec Decode
    Bonjour,

    J'ai un problème de précision causé par la fonction decode sur un test de nullité d'un timestamp. Auriez vous une idée ?

    Ma requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    INSERT INTO table1 
       (SELECT ... 
        FROM table2  
        WHERE timestamp > (SELECT MAX (decode(timestamp, null, (systimestamp - 7), timestamp) FROM table1));
    J'ai essayé de conserver la précision en ajoutant des fonctions to_timestamp mais rien n'y fait, je perds les fractions de seconde.

    Du coup, j'hésite à faire un script en PL/SQL pour savoir si ma table est null avant le début de la requête.
    J'hésitais aussi à faire une requête d'insertion conditionnelle mais dans ce cas elle va tester la nullité de chaque entrée, ce qui est inutile.

    merci d'avance !

  2. #2
    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
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (SELECT MAX (CASE WHEN timestamp iS NULL then systimestamp - 7 else timestamp end) FROM table1);

  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
    Merci

    Je n'avais pas pensé à cette solution !

    Est-ce normal la perte de précision avec la fonction décode ?

  4. #4
    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
    en fait, j'ai refais un test : c'est le systimestamp -7 qui transforme en date
    le type de retour du decode est déterminé par la première valeur de retour (notion importante à savoir dans le cas des NULL pour une date par exemple)

    J'ai réussi à le faire marcher avec decode
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT DECODE(SYSTIMESTAMP, NULL, CAST(SYSTIMESTAMP - 7 AS TIMESTAMP), SYSTIMESTAMP) D1, 
    		SYSTIMESTAMP -7 d2, 
        CAST(DECODE(SYSTIMESTAMP, NULL, SYSTIMESTAMP - 7, SYSTIMESTAMP) AS TIMESTAMP) d3,
        CASE WHEN SYSTIMESTAMP IS NULL THEN SYSTIMESTAMP - 7 ELSE SYSTIMESTAMP END d4
    FROM dual
     
     
    D1	D2	D3	D4
    27/09/2011 10:57:29.653906	20/09/2011 10:57:29	27/09/2011 10:57:29.000000	27/09/2011 10:57:29.653906 +02:00
    Pour le NULL avec date ou chaine dont j'ai parlé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    SELECT DUMP(DECODE(1, 2, '', SYSDATE)), 
    			DUMP(DECODE(1, 2, TO_DATE(NULL), SYSDATE))
    FROM dual
     
    DUMP(DECODE(1,2,'',SYSDATE))	DUMP(DECODE(1,2,TO_DATE(NULL),SYSDATE))
    Typ=1 Len=9: 50,55,45,83,69,80,45,49,49	Typ=13 Len=8: 219,7,9,27,10,59,38,0
     
    SELECT DECODE(1, 2, '', SYSDATE),
    			DECODE(1, 2, TO_DATE(NULL), SYSDATE)
    FROM dual
    DECODE(1,2,'',SYSDATE)	DECODE(1,2,TO_DATE(NULL),SYSDATE)
    27-SEP-11	27/09/2011 11:01:31
    Dans le premier cas on a une chaine de caractère, dans le second une vraie date, essaye de rajouter un jour, ça marchera dans le second, mais pas dans le premier
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT DECODE(1, 2, TO_DATE(NULL), SYSDATE) + 1
    FROM dual
     
    DECODE(1,2,TO_DATE(NULL),SYSDATE)+1
    28/09/2011 11:02:39
     
    SELECT DECODE(1, 2, '', SYSDATE) + 1
    FROM dual
    ORA-01722: invalid number

  5. #5
    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 pour l'explication

  6. #6
    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
    donc
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    systimestamp - interval '7' day

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

Discussions similaires

  1. pb avec Decode, group by
    Par aurelie83 dans le forum SQL
    Réponses: 1
    Dernier message: 05/11/2007, 16h12
  2. [RegEx] Regex pour créer un timestamp avec mktime
    Par Viper13 dans le forum Langage
    Réponses: 3
    Dernier message: 16/08/2007, 20h58
  3. Gérer timestamp avec PHP ou mysql ?
    Par jcaspar dans le forum SQL Procédural
    Réponses: 2
    Dernier message: 02/04/2007, 15h13
  4. [SQL] update avec decode
    Par jojo22222 dans le forum Oracle
    Réponses: 8
    Dernier message: 04/01/2006, 17h50
  5. Remplir un timestamp avec un string ?
    Par nadass dans le forum Langage
    Réponses: 4
    Dernier message: 16/11/2005, 23h54

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