Précédent   Forum des professionnels en informatique > Bases de données > Oracle > PL/SQL
PL/SQL Forum d'entraide sur le PL/SQL
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/05/2011, 08h54   #1
Membre habitué
 
Luis
Inscription : avril 2006
Messages : 436
Détails du profil
Informations personnelles :
Nom : Luis

Informations forums :
Inscription : avril 2006
Messages : 436
Points : 119
Points : 119
Par défaut Conversion timestamp vers date

Salut a tous,

oracle 11g sous linux
Soit une table TEST avec un champ fecha(date) de type NUMBER
Dans le champs

Code :
1
2
3
4
5
SQL> SELECT fecha "date" FROM test;
 
      date
----------
1,0819E+12

Ce que je voudrais c'est faire une select et dortir la date qui corespond.
J'ai Googeler un peu et j'ai trouvé la fonction suivante:

Code :
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
SQL> CREATE OR REPLACE
  2      FUNCTION unixts_to_date(unixts IN PLS_INTEGER) RETURN DATE IS
  3          /**
  4           * Converts a UNIX timestamp into an Oracle DATE
  5           */
  6          unix_epoch DATE := TO_DATE('19700101000000','YYYYMMDDHH24MISS');
  7          max_ts PLS_INTEGER := 2145916799; -- 2938-12-31 23:59:59
  8          min_ts PLS_INTEGER := -2114380800; -- 1903-01-01 00:00:00
  9          oracle_date DATE;
 10
 11          BEGIN
 12
 13              IF unixts> max_ts THEN
 14                  RAISE_APPLICATION_ERROR(
 15                      -20901,
 16                      'UNIX timestamp too large for 32 bit limit'
 17                  );
 18              ELSIF unixts <min_ts THEN
 19                  RAISE_APPLICATION_ERROR(
 20                      -20901,
 21                      'UNIX timestamp too small for 32 bit limit' );
 22              ELSE
 23                  oracle_date := unix_epoch + NUMTODSINTERVAL(unixts, 'SECOND');
 24              END IF;
 25
 26              RETURN (oracle_date);
 27
 28  END;
 29  /
Function created.

Mais...ça donne l'erreur que vous pouvez voir:

Code :
1
2
3
4
5
6
SQL> SELECT unixts_to_date(1081936800000) FROM dual;
SELECT unixts_to_date(1081936800000) FROM dual
       *
ERROR at line 1:
ORA-20901: UNIX timestamp too large FOR 32 bit LIMIT
ORA-06512: en "EXPLO.UNIXTS_TO_DATE", linea 13
Ça serait plus facil avec un champ de type timestamp mais la base n'a pas ete faite comme ça. Existe t'il une solution?
D'avance merci
ldiaz est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/05/2011, 09h59   #2
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 810
Points : 5 810
Multipliez vos données par 1E-6 avant de les passer dans la fonction.
mnitu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/05/2011, 10h08   #3
Membre habitué
 
Luis
Inscription : avril 2006
Messages : 436
Détails du profil
Informations personnelles :
Nom : Luis

Informations forums :
Inscription : avril 2006
Messages : 436
Points : 119
Points : 119
Bonjour
pardon de demander, mais comment ça se traduit en SQL cette multiplication?

Si j'ai ceci:

Code :
SELECT unixts_to_date(1081936800000) FROM dual;
il faut que je fasse ceci?

Code :
SELECT unixts_to_date(1081936800000*1E-6) FROM dual;
Ca marche mais je suis pas sur que le resultat soit le correct...

Code :
1
2
3
4
5
SQL> SELECT unixts_to_date(1081936800000*1E-6) FROM dual;
 
UNIXTS_T
--------
13/01/70
car avec plusieurs timestamp defferents j'ai toujours le meme resultat.
ldiaz est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/05/2011, 11h44   #4
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 810
Points : 5 810
Est-ce que comme ça vos dates ont plus de signification ?
Code :
1
2
3
4
5
6
 
SQL> SELECT unixts_to_date(1081936800000*1E-3) FROM dual;
 
UNIXTS_TO_DATE(1081936800000*1
------------------------------
14/04/2004 10:00:00
mnitu est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 27/05/2011, 12h01   #5
Membre habitué
 
Luis
Inscription : avril 2006
Messages : 436
Détails du profil
Informations personnelles :
Nom : Luis

Informations forums :
Inscription : avril 2006
Messages : 436
Points : 119
Points : 119
Bonjour

whaaaa voila cette fois ça marche bien.
Merci beaucoup

Bon week end a tous.
ldiaz 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 19h56.


 
 
 
 
Partenaires

Hébergement Web