Transformation de string en java.sql.date

Transformation de string en java.sql.date - Java - Programmation

Marsh Posté le 02-08-2005 à 08:28:31    

Bonjour à tous,  
J'ai un petit souci de transformation d'une String en date.
 
Ma string est de ce format : 01-Aug-2005 17:38:14
J'essaie de la tranformation en type date et j'obtiens ceci : 2005-08-01
 
Le problème est que ce n'est pas le résultat que je souhaite  :cry:  
 
En effet, le résultat que je voudrais est la même chose que ma String mais au format date.
 
J'ai le code suivant :
 

Code :
  1. public void fonction (String currentDate,int id, String dateExp)
  2. {
  3.         Date result1 = null, result2 =null;
  4.         try
  5.         {
  6.             SimpleDateFormat sdf = new SimpleDateFormat("dd-MMM-yyyy HH:mm:ss",Locale.ENGLISH);
  7.  
  8.             ParsePosition pos = new ParsePosition(0);
  9.             java.util.Date resultTemp = sdf.parse(currentDate,pos);
  10.             result1 = new Date(resultTemp.getTime());
  11.            
  12.             pos = new ParsePosition(0);
  13.             resultTemp = sdf.parse(dateExp,pos);
  14.             result2 = new Date(resultTemp.getTime());
  15.            
  16.             System.out.println("CurrentDate = " + currentDate);
  17.             System.out.println("result1.toString() = " + result1.toString());
  18.            
  19.             Statement update = connect.createStatement();
  20.             update.executeUpdate("UPDATE PDM.ITTWFSTEP SET DATEIN = TO_DATE('"+ result1.toString() +"','DD-MON-YYYY HH24:MI:SS'), DATEEXP = TO_DATE('"+ result2.toString() +"','DD-MON-YYYY HH24:MI:SS') WHERE ID= "+ id);


 
Mes 2 "System.out.println" me sortent donc le résultat suivant :
CurrentDate = 01-Aug-2005 17:38:14
result1.toString() = 2005-08-01
 
En plus, j'ai l'erreur suivante quand je veux insérer dans ma base de données avec la fonction ci-dessus:
 
SQLState : 22008
Description : ORA-01861: le littéral ne concorde pas avec le format chaîne de caractères
Error code : 1861
 
Je pense que cette erreur est liée au fait que justement, je n'insère pas au format souhaité dans la base.  :pfff:  
 
Pouvez-vous m'aider s'il vous plééééééé!!!  :cry:  :cry:  :cry:  

Reply

Marsh Posté le 02-08-2005 à 08:28:31   

Reply

Marsh Posté le 02-08-2005 à 08:50:09    

Il y a quelque chose que je n'ai pas dû comprendre.
Si tu veux que result1.toString() soit exactement le même que la String currentDate, il suffit... de remplacer le result1.toString() de ton code par currentDate ?
 
Nicolas

Reply

Marsh Posté le 02-08-2005 à 09:04:11    

[u]

Nicolas_75 a écrit :

Il y a quelque chose que je n'ai pas dû comprendre.
Si tu veux que result1.toString() soit exactement le même que la String currentDate, il suffit... de remplacer le result1.toString() de ton code par currentDate ?
 
Nicolas


 
Oui, tu as raison: j'ai oublié de préciser un gros détails :sarcastic:  Le problème que j'ai est que la base de données n'accepte que des dates au format français. Il me faut donc transformer 01-Aug-2005 17:38:14  
en 01-août -2005 17:38:14 AM (C'est comme ca que c'est stocké dans la base)
 
...mais ca marche pô... :cry:

Reply

Marsh Posté le 02-08-2005 à 09:06:21    

cemoi58 a écrit :

[u]
 
Oui, tu as raison: j'ai oublié de préciser un gros détails :sarcastic:  Le problème que j'ai est que la base de données n'accepte que des dates au format français. Il me faut donc transformer 01-Aug-2005 17:38:14  
en 01-août -2005 17:38:14 AM (C'est comme ca que c'est stocké dans la base)
 
...mais ca marche pô... :cry:


 
Petit rectificatif : c'est 5:38:14 AM et non pas 17:38:14 AM

Reply

Marsh Posté le 02-08-2005 à 09:13:51    


Le format d'arrivée est : "01-août-2005 5:38:14 AM".
C'est un mélange de français et d'anglais, non ?

Reply

Marsh Posté le 02-08-2005 à 09:18:50    

Après tout, pourquoi pas ?

Code :
  1. import java.text.SimpleDateFormat;
  2. import java.util.Date;
  3. import java.util.Locale;
  4. public class TestFormatDate {
  5.    
  6.    public static void main(String[] args) {
  7.           try {
  8.             String s3 = "01-Aug-2005 17:38:14";
  9.             System.out.print(s3+" -> " );
  10.             Date date = new SimpleDateFormat("dd-MMM-yyyy HH:mm:ss",Locale.ENGLISH).parse(s3);
  11.             String s4 = new SimpleDateFormat("dd-MMM-yyyy hh:mm:ss aaa", Locale.FRENCH).format(date);
  12.             System.out.println(s4);
  13.         } catch (Exception e) { e.printStackTrace(); }
  14.     }
  15. }


Sortie :

01-Aug-2005 17:38:14 -> 01-août-2005 05:38:14 PM

Reply

Marsh Posté le 02-08-2005 à 09:23:03    

Nicolas_75 a écrit :

Le format d'arrivée est : "01-août-2005 5:38:14 AM".
C'est un mélange de français et d'anglais, non ?


 
Oui, mais apparemment c'est possible de le faire.
En fait, c'est pas moi qui ai fait la base de données et donc je suis obligé de m'adapter à ce que qui a été fait...malheureusement :(  
 
Mais il semble que côté heure, Oracle se charge lui-même de faire la transformation de 17:38:14 vers 5:38:14 AM. C'est en tout cas ce que j'ai remarqué en insérant 17:38:14 dans la base.  

Reply

Marsh Posté le 02-08-2005 à 09:27:32    

OK ! Le code ci-dessus répond-il à ton besoin ?
 
Nicolas

Reply

Marsh Posté le 02-08-2005 à 09:41:41    

Nicolas_75 a écrit :

OK ! Le code ci-dessus répond-il à ton besoin ?
 
Nicolas


 
Oui!!! C'est cool, la date est au bon format mais visiblement, lors de l'insertion dans la base de données, ca me met :
 
SQLState : 22008
Description : ORA-01843: ce n'est pas un mois valide
Error code : 1843
 
Mais, maintenant, je pense que c'est plus un problème lié à la base elle-même. Je vais regarder ca de plus prêt car la date est à ce format dans la base de données, je vais regarder si ce n'est pas dû au caractère " " manquant dans "01-août -2005 11:31:16 AM" entre la fin de "août" et le "-"
 
Je te tiens au courant.
 

Reply

Marsh Posté le 02-08-2005 à 09:48:31    

Si il y a un espace toujours, quelque soit le mois, il suffit de substituer dans mon code :

Code :
  1. String s4 = new SimpleDateFormat("dd-MMM -yyyy hh:mm:ss aaa", Locale.FRENCH).format(date);


En revanche, si l'espace est dû à un formatage du mois sur 5 caractères, cela risque d'être plus compliqué !
 
Nicolas


Message édité par Nicolas_75 le 02-08-2005 à 09:49:51
Reply

Marsh Posté le 02-08-2005 à 09:48:31   

Reply

Marsh Posté le 02-08-2005 à 14:18:33    

Nicolas_75 a écrit :

Si il y a un espace toujours, quelque soit le mois, il suffit de substituer dans mon code :

Code :
  1. String s4 = new SimpleDateFormat("dd-MMM -yyyy hh:mm:ss aaa", Locale.FRENCH).format(date);


En revanche, si l'espace est dû à un formatage du mois sur 5 caractères, cela risque d'être plus compliqué !
 
Nicolas


Voilà, j'ai ré-essayer mais j'ai toujours des problèmes lors de l'insertion dans la base.
Si je mets :
 

Code :
  1. System.out.print(currentDate+" -> " );
  2.                 date = new SimpleDateFormat("dd-MMM-yyyy HH:mm:ss",Locale.ENGLISH).parse(currentDate);
  3.            
  4.                 s4 = new SimpleDateFormat("dd-MMM-yyyy hh:mm:ss aaa", Locale.FRENCH).format(date);
  5.                 System.out.println(s4);
  6. System.out.println("CurrentDate = " + currentDate);
  7.             //System.out.println("result1.toString() = " + result1.toString());
  8.             System.out.println("date = " + date.toString());
  9.             System.out.println("s4 = " + s4);


 
 
 
Ce qui m'affiche en sortie :
02-Aug-2005 14:12:25 -> 02-août-2005 02:12:25 PM
CurrentDate = 02-Aug-2005 14:12:25
date = Tue Aug 02 14:12:25 CEST 2005
s4 = 02-août-2005 02:12:25 PM
 
 
alors le message est le suivant :
SQLState : 22008
Description : ORA-01858: caractère non numérique rencontré à la place d'un numérique
Error code : 1858
 
et la requête qui l'a généré est :
 
Statement update = connect.createStatement();
update.executeUpdate("UPDATE PDM.ITTWFSTEP SET DATEIN = TO_DATE('"+ s4 +"','DD-MON-YYYY HH:MI:SS'), DATEEXP = TO_DATE('"+ s4 +"','DD-MON-YYYY HH:MI:SS') WHERE ID="+ idWF);
 
 

Reply

Marsh Posté le 02-08-2005 à 14:22:12    

cemoi58 a écrit :

Voilà, j'ai ré-essayer mais j'ai toujours des problèmes lors de l'insertion dans la base.
Si je mets :
 

Code :
  1. System.out.print(currentDate+" -> " );
  2.                 date = new SimpleDateFormat("dd-MMM-yyyy HH:mm:ss",Locale.ENGLISH).parse(currentDate);
  3.            
  4.                 s4 = new SimpleDateFormat("dd-MMM-yyyy hh:mm:ss aaa", Locale.FRENCH).format(date);
  5.                 System.out.println(s4);
  6. System.out.println("CurrentDate = " + currentDate);
  7.             //System.out.println("result1.toString() = " + result1.toString());
  8.             System.out.println("date = " + date.toString());
  9.             System.out.println("s4 = " + s4);


 
 
 
Ce qui m'affiche en sortie :
02-Aug-2005 14:12:25 -> 02-août-2005 02:12:25 PM
CurrentDate = 02-Aug-2005 14:12:25
date = Tue Aug 02 14:12:25 CEST 2005
s4 = 02-août-2005 02:12:25 PM
 
 
alors le message est le suivant :
SQLState : 22008
Description : ORA-01858: caractère non numérique rencontré à la place d'un numérique
Error code : 1858
 
et la requête qui l'a généré est :
 
Statement update = connect.createStatement();
update.executeUpdate("UPDATE PDM.ITTWFSTEP SET DATEIN = TO_DATE('"+ s4 +"','DD-MON-YYYY HH:MI:SS'), DATEEXP = TO_DATE('"+ s4 +"','DD-MON-YYYY HH:MI:SS') WHERE ID="+ idWF);


 
 
 
 
 
 
C'est chiant: ca fait une journée maintenant que je suis sur ce problème... :pt1cable:

Reply

Marsh Posté le 02-08-2005 à 14:42:19    

Je ne connais pas SQL, et vais probablement dire une énorme bêtise. Ton "format" ('DD-MON-YYYY HH:MI:SS') impose-t-il un mois en 3 caractères ? (Car ce n'est pas le cas de s4.)
 
Nicolas

Reply

Marsh Posté le 02-08-2005 à 14:49:03    

- Attention à ton masque : HH -> Hour of day (1-12)
- Simplifie ton query pour ne garder qu'un champs à la fois sans clause WHERE. Dans le query que tu nous propose, tu cumules les risques à 3 endroits : comment sais-tu de quel champs il s'agit ?
 
[:pingouino]


---------------
Now Playing: {SYNTAX ERROR AT LINE 1210}
Reply

Marsh Posté le 02-08-2005 à 15:05:33    

et surtout, utilise des PreparedStatement et te fais pas chier avec ca, apres tu fais un setDate(..) de ton objet, et ca roule :o

Reply

Marsh Posté le 02-08-2005 à 15:06:44    

sircam a écrit :

- Attention à ton masque : HH -> Hour of day (1-12)
- Simplifie ton query pour ne garder qu'un champs à la fois sans clause WHERE. Dans le query que tu nous propose, tu cumules les risques à 3 endroits : comment sais-tu de quel champs il s'agit ?
 
[:pingouino]


 
Ca y est: j'ai trouvé!!!!!! :bounce:  
 
En fait, il y avait plusieurs erreurs qui empêchait l'insertion.
 
La première : en regardant la table oracle, j'avais des dates de ce format :
 
27-avr. -2005 04:48:24 PM
10-mai  -2005 02:56:34 PM
 
Donc, je m'étais dit que le mois était abrégé puisque pour "avril", par exemple, on a un '.'  
Or, ce n'est pas le cas du tout! J'ai essayé en mettant dans ma requête "MONTH" pour signaler le mois complet et là, ca marche!  
 
Voici donc mon code :
 

Code :
  1. System.out.print(currentDate+" -> " );
  2.                 date = new SimpleDateFormat("dd-MMM-yyyy HH:mm:ss",Locale.ENGLISH).parse(currentDate);
  3.            
  4.                 s4 = new SimpleDateFormat("dd-MMM-yyyy HH:mm:ss", Locale.FRENCH).format(date);
  5.                System.out.println(s4);
  6.                System.out.println("CurrentDate = " + currentDate);
  7.                System.out.println("date = " + date.toString());
  8.                System.out.println("s4 = " + s4);
  9.                        
  10.                Statement update = connect.createStatement();
  11.               update.executeUpdate("UPDATE PDM.ITTWFSTEP SET DATEIN = TO_DATE('"+ s4 +"','DD-MONTH-YYYY HH24:MI:SS'), DATEEXP = TO_DATE('"+ s4 +"','DD-MONTH-YYYY HH24:MI:SS') WHERE IDWF="+ idWF +" AND TYPEWF = '"+ typeDoc +"' AND STATEWF <> 'INITIATION'" );


 
Ce qui donne à l'affichage :
 
02-Aug-2005 14:47:06 -> 02-août-2005 14:47:06
CurrentDate = 02-Aug-2005 14:47:06
date = Tue Aug 02 14:47:06 CEST 2005
s4 = 02-août-2005 14:47:06
 
Et on peut voir ici que le mois d'août n'est pas abrégé! :D  
 
Par contre, et c'est la 2ème subtilité : j'ai dû enlever le "aaa" dans le masque de s4 qui m'indiquait AM ou PM.  
Pour le masque de la requête, il m'a fallut rajouter le 24 effectivement... et c'est Oracle qui met l'heure au format américain. C'est vicieux ça : visiblement, je n'avais pas le droit de le préciser moi-même!!!!  
 
Merci pour vos réponses et surtout, merci Nico pour m'avoir donner la soluce du formattage de la date : j'avais réfléchi dessus tout l'après-midi d'hier! :jap:  
 

Reply

Marsh Posté le 02-08-2005 à 15:10:01    

lorill a écrit :

et surtout, utilise des PreparedStatement et te fais pas chier avec ca, apres tu fais un setDate(..) de ton objet, et ca roule :o


 
Vi mais c'est interressant aussi de savoir pourquoi ca déconne... :ange:

Reply

Sujets relatifs:

Leave a Replay

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