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 27/09/2011, 09h49   #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 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 :
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 !
alex_972 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/09/2011, 10h11   #2
McM
Expert Confirmé Sénior
 
Inscription : juillet 2003
Messages : 3 440
Détails du profil
Informations forums :
Inscription : juillet 2003
Messages : 3 440
Points : 4 183
Points : 4 183
Code :
(SELECT MAX (CASE WHEN timestamp IS NULL then systimestamp - 7 else timestamp end) FROM table1);
__________________
More Code : More Bugs. Less Code : Less Bugs
McM est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 27/09/2011, 10h24   #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
Merci

Je n'avais pas pensé à cette solution !

Est-ce normal la perte de précision avec la fonction décode ?
alex_972 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/09/2011, 11h03   #4
McM
Expert Confirmé Sénior
 
Inscription : juillet 2003
Messages : 3 440
Détails du profil
Informations forums :
Inscription : juillet 2003
Messages : 3 440
Points : 4 183
Points : 4 183
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 :
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 :
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 :
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
__________________
More Code : More Bugs. Less Code : Less Bugs
McM est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 27/09/2011, 11h14   #5
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 pour l'explication
alex_972 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/09/2011, 12h49   #6
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
donc
Code :
systimestamp - interval '7' day
__________________
Mon blog : laurentschneider.com
Mon livre : Advanced Oracle SQL Programming
laurentschneider est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/09/2011, 18h08   #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
Et sinon, vous ne connaissez pas les fonctions NVL / COALESCE ?
Code :
SELECT MAX(COALECE(timestamp, systimestamp - 7)) FROM table1
__________________
Email : http://scr.im/waldar
Waldar est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/09/2011, 09h43   #8
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
Citation:
Envoyé par Waldar Voir le message
Et sinon, vous ne connaissez pas les fonctions NVL / COALESCE ?
Code :
SELECT MAX(COALECE(timestamp, systimestamp - 7)) FROM table1
Faite attention aux conversions implicites
Code :
1
2
3
4
5
6
7
8
9
10
11
 
SQL> SELECT dump(systimestamp) AS a, dump(systimestamp - 7) AS b, dump(systimestamp - interval '7' day) AS c
  2  FROM dual
  3  /
 
A                    B                    C
-------------------- -------------------- --------------------
Typ=188 Len=20: 7,21 Typ=13 Len=8: 7,219, Typ=188 Len=20: 7,21
9,9,28,10,41,18,32,3 9,21,9,41,18,0       9,9,21,10,41,18,0,31
1,173,25,176,255,0,5                      ,173,25,176,255,0,5,
,32,0,0,50,49                             0,0,0,0,0
mnitu est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 28/09/2011, 11h10   #9
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
En plus c'était écrit juste au-dessus !
__________________
Email : http://scr.im/waldar
Waldar est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 28/09/2011, 15h23   #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
Notez aussi la différence entre coalesce et nvl !

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
SQL> SELECT nvl(to_date(NULL),systimestamp  - interval '7' day) FROM dual;
NVL(TO_DATE(NULL),SYSTIMESTAMP-INTERVAL'7'DAY)
----------------------------------------------
21-SEP-11
SQL> SELECT nvl(sysdate,systimestamp - interval '7' day) FROM dual;
NVL(SYSDATE,SYSTIMESTAMP-INTERVAL'7'DAY)
----------------------------------------
28-SEP-11
SQL> SELECT coalesce(to_date(NULL),systimestamp - interval '7' day) FROM dual;
COALESCE(TO_DATE(NULL),SYSTIMESTAMP-INTERVAL'7'DAY)
---------------------------------------------------
21.09.2011 15:26:19.520283000 +02:00
SQL> SELECT coalesce(sysdate,systimestamp - interval '7' day) FROM dual;
COALESCE(SYSDATE,SYSTIMESTAMP-INTERVAL'7'DAY)
---------------------------------------------
28.09.2011 15:26:19.000000000 +02:00
__________________
Mon blog : laurentschneider.com
Mon livre : Advanced Oracle SQL Programming
laurentschneider est déconnecté   Envoyer un message privé Réponse avec citation 20
Vieux 28/09/2011, 16h00   #11
McM
Expert Confirmé Sénior
 
Inscription : juillet 2003
Messages : 3 440
Détails du profil
Informations forums :
Inscription : juillet 2003
Messages : 3 440
Points : 4 183
Points : 4 183
NVL est du type de la première valeur, COALESCE.. j'en sais rien

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
SELECT NVL(CAST(TO_DATE(NULL) AS TIMESTAMP), SYSDATE) AS d
FROM dual
d
28/09/2011 15:56:38.000000
 
SELECT NVL(CAST(TO_DATE(NULL) AS TIMESTAMP), 1)
FROM dual
ORA-00932: inconsistent datatypes: expected TIMESTAMP got NUMBER
 
SELECT COALESCE(SYSDATE, SYSTIMESTAMP, 1)
FROM dual
ORA-00932: inconsistent datatypes: expected TIMESTAMP got NUMBER
 
SELECT COALESCE(1, SYSDATE, SYSTIMESTAMP, 1)
FROM dual
ORA-00932: inconsistent datatypes: expected NUMBER got DATE
__________________
More Code : More Bugs. Less Code : Less Bugs
McM est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/09/2011, 16h51   #12
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
coalesce apparement convertit vers le type à la meilleure précision, mais j'ai demandé à l'auteur de la documentation SQL de me donner des détails... à suive
__________________
Mon blog : laurentschneider.com
Mon livre : Advanced Oracle SQL Programming
laurentschneider est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 22h45.


 
 
 
 
Partenaires

Hébergement Web