[Oracle] Récupération et calculs sur dates

Récupération et calculs sur dates [Oracle] - SQL/NoSQL - Programmation

Marsh Posté le 13-12-2007 à 12:12:08    

Bonjour à tous,
 
je viens vous demander de l'aide car mes connaissances en Oracle sont très limitées, je débarque dessus et je suis bloqué pour un problème qui peut paraitre bête...
 
Voici une description simplifiée de mon problème. J'ai une table PRM, contenant les champs ID et VAL. Une de mes entrée (avec l'ID 10 par exemple) contient une date (format: dd/mm/yyyy hh24:mm:ss), une autre entrée (avec l'ID 11) contient un nombre entier représentant un temps en minute. Je dois prendre ma date, y ajouter mon nombre de minutes et vérifier que le résultat est supérieur ou inférieur à la date du système...
 
On m'a dit que cela était faisable en Oracle avec to_date mais je nage complètement... :sweat:  
 
Merci d'avance de votre aide!
 

Reply

Marsh Posté le 13-12-2007 à 12:12:08   

Reply

Marsh Posté le 13-12-2007 à 12:56:51    

Essayer !

Select to_date(  to_number(to_date(t1.val, 'dd/mm/yyyy hh24:mi:ss'))
               + to_number(to_date(t2.val, 'mi')),
               'dd/mm/yyyy hh24:mi:ss')
  from la_table t1, la_table t2
 where t1.ID = 10
   and t2.ID = 11
   and t2.clef = t1.clef


Message édité par olivthill le 16-12-2007 à 11:37:32
Reply

Marsh Posté le 13-12-2007 à 14:42:30    

Merci de cette réponse!
 
Je viens d'essayer ceci:

Code :
  1. Select to_date(  to_number(to_date(t1.val, 'dd/mm/yyyy hh24:mi:ss'))
  2.                + to_number(to_date(t2.val, 'mi')),
  3.                'dd/mm/yyyy hh24:mi:ss')
  4.   from prm
  5. where t1.id = '99609'
  6.     and t2.id = '99610'


 
sans succès:

Code :
  1. ORA-00904: "T2"."ID": identificateur invalide


 
Si quelqu'un a une idée...
 
Merci :)

Reply

Marsh Posté le 13-12-2007 à 15:53:21    

Comme il y a deux enregistrements différents pour la même table il faut utiliser le from que j'avais mis où les alias t1 et t2 permettent de distinguer les deux enregistrements :

 from prm t1, prm t2

Reply

Marsh Posté le 13-12-2007 à 16:18:36    

Merci de ton aide :)
 
Je viens de lancer ceci:

Code :
  1. Select to_date(  to_number(to_date(t1.val, 'dd/mm/yyyy hh24:mi:ss'))
  2.                + to_number(to_date(t2.val, 'mi')),
  3.                'dd/mm/yyyy hh24:mi:ss')
  4.   from prm t1, prm t2
  5. where t1.id = '10'
  6.   and t2.id = '11'


 
mais j'ai cette erreur:

Code :
  1. ORA-01722: nombre non valide


 
Doit y avoir un problème au niveau du calcul non?

Reply

Marsh Posté le 14-12-2007 à 14:08:41    

je pige pas trop le coup des to_number...
 
à quoi il servent ? :heink:

Reply

Marsh Posté le 14-12-2007 à 14:16:15    

Code :
  1. SELECT to_number(sysdate) FROM dual;


=> Sur une 10gR2 en tout cas, ça passe pas, j'ai la même erreur.
 
En revanche :

Code :
  1. SELECT sysdate + INTERVAL '30' MINUTE FROM dual;


Ca marche.
 
Je ne vous le faire pas dire, c'est absolument horrible comme syntaxe.
Mais bon, Oracle c'est tellement de la merde que c'est pas une surprise...
 
Voici une référence assez utile :
http://www.psoug.org/reference/date_func.html

Reply

Marsh Posté le 14-12-2007 à 14:21:10    

A noter aussi que...
 

Code :
  1. SELECT to_number(to_char(to_date('30', 'MI'), 'YYYYMMDDHH24MISS')) FROM dual;


 


20071201003000


 
Quand je dis que c'est de la merde...

Reply

Marsh Posté le 14-12-2007 à 15:13:16    

ceci dit
 

Code :
  1. select sysdate + (30/1440)
  2. from dual


 
marche aussi pour rajouter 30 mins
 
pour l'histoire du 20071201003000 ca ne m'étonne pas plus que ca, est ce qu'il y a un sgbd qui retourne réellement un truc cohérent? y devrait juste thrower une exception pour oracle a la limite.


Message édité par casimimir le 14-12-2007 à 15:13:31
Reply

Marsh Posté le 14-12-2007 à 17:12:02    

Sous SQL Server, ça te crée une date 01/01/0000 00:30:00
Du moins il me semble (c con, là j'ai pas de SQL Server sous la main pour tester...)
 
Ce qui est la logique même...
 
Au pire, il devrait retourner un truc du genre 01/01/1970 00:30:00 puisque sur la plupart des systèmes la date "zéro" correspond au 01/01/1970 00:00:00 (et null à 31/12/1969 23:59:59)

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed