n° 185
Maggio/Giugno 2013
Maggio 19, 2013, 09:51:25 pm *
Benvenuto! Accedi o registrati.
Hai dimenticato l'e-mail di attivazione?

Accesso con nome utente, password e durata della sessione
Notizia:
 
   Indice   Linux Windows Techassistance Gameassistance videogame hardware Aiuto Ricerca Agenda Downloads Accedi Registrati  

* Messaggi recenti
Messaggi recenti
Pagine: [1]   Vai giù
  Stampa  
Autore Discussione: Jdbc - MySQL insert di date formattate  (Letto 741 volte)
0 utenti e 1 Utente non registrato stanno visualizzando questa discussione.
SHARKSEAL
Newbie
*

Karma: +0/-0
Scollegato Scollegato

Messaggi: 46


Mostra profilo
« inserita:: Luglio 01, 2012, 06:58:49 pm »

Ciao a tutti

Ho notato che anche se io formatto la data con SimpleDateFormat da java

nel momento in cui faccio una insert con un PreparedStarement nel db MySQL non viene rispettata la
formattazione esempio:

io creo la data formattata (dd/MM/yy) ovvero con l'anno a due cifre piuttosto che 4

quando po da insert faccio:

ps.setDate(java.sql.Date(dataFormattata) nel db MySQL mi ritrovo puntualmente la data in questo formato  yyyy/MM/dd

Non è possibile memorizzare in mySQL date con anno a due cifre ?? 
Se si quale metodo potrei utilizzare? 
Se no quale alternativa potrei adottare visto che tassativamente ho bisogno di fare controlli su Date con anno a due cifre.

Grazie a tutti per la disponibilità Occhiolino
Registrato
ctraversa
Jr. Member
**

Karma: +14/-7
Scollegato Scollegato

Messaggi: 155


Mostra profilo
« Risposta #1 inserita:: Luglio 01, 2012, 08:08:19 pm »

A meno che tu abbia omesso di descrivere qualche dettaglio importante non capisco cosa ti importa di come viene memorizzato l'anno sulla base dati. Che sia mysql, oracle, postgres, sql server e via discorrendo se devi fare controlli con le date a due anni o li fai prima della insert e quindi il controllo viene fatto nel codice. Come memorizza la data poi sul DB non ha più importanza. Oppure li devi fare dopo la insert. In questo caso sicuramente farai una select per recuperarli dal DB e quindi ti formatti la data come ti pare e poi fai i controlli.
Registrato
SHARKSEAL
Newbie
*

Karma: +0/-0
Scollegato Scollegato

Messaggi: 46


Mostra profilo
« Risposta #2 inserita:: Luglio 02, 2012, 01:36:26 am »

Ho tralasciato i dettagli

In realtà la situazione è questa:
questi movimenti vengono letti da una memoria ... che memorizza le date solo con due cifre dell'anno
ovviamente questi movimenti letti da una memoria vengono poi scaricati nel db ... e sul cumulo dei movimenti posso effettuare una visualizzazione per movimenti avvenuti tra una data ed un'altra

Esempio : leggo dalla memoria 10 movimenti e li memorizzo ... poi ne leggo altri 40 e li memorizzo e cosi' via alla fine in archivio mi trovo 200 movimenti ... e tra questi vorrei visualizzare solo quelli ad esempio

dal 12/03/12 al 23/08/12 ecco il perche della domanda sulle date Occhiolino
Registrato
ctraversa
Jr. Member
**

Karma: +14/-7
Scollegato Scollegato

Messaggi: 155


Mostra profilo
« Risposta #3 inserita:: Luglio 02, 2012, 10:24:19 am »

Non vedo comunque il problema. Li leggi dalla memoria con l'anno a 2 cifre. Li memorizzi sul DB a 4 cifre. Quando poi li devi visualizzare fai la select con la condizione di where "Campo Data Movimento" between 12/03/12 and 23/08/12 e poi nel while(rs.next()) del ResultSet formatti la data come vuoi.
Comunque mi pare di capire che tu vuoi memorizzare sul DB le date con sole 2 cifre nell'anno per poter far la condizione di where con l'anno a 2 sole cifre come nel caso 12/03/12 al 23/08/12.
Sappi in tal caso che anche se la condizione di where è a 2 cifre sull'anno e sul DB a 4 il criterio di where funziona ugualmente.
Registrato
SHARKSEAL
Newbie
*

Karma: +0/-0
Scollegato Scollegato

Messaggi: 46


Mostra profilo
« Risposta #4 inserita:: Luglio 03, 2012, 12:28:08 am »

Effettivamente ora che mi ci fai pensare  Occhi al cielo

Io in pratica ho provato a fare una cosa del genere:

Codice:
// Calendar per creare la data
Calendar dateCalendar = new GregorianCalendar();

dateCalendar.set(Calendar.DAY_OF_MONTH, giornoMovimento);
dateCalendar.set(Calendar.MONTH, meseMovimento);
dateCalendar.set(Calendar.YEAR, annoMovimento);


DateFormat df;

if (dateCalendar.getTime() != null){
df = new SimpleDateFormat("dd/MM/yy"); 
dataInizioMovimento = df.format(dateCalendar.getTime());

 

In pratica riesco a vedere la data con l'anno a due cifre ma poi


quando con il PreparedStatement faccio l'insert del movimento

quindi solita prassi:

ps.setDate(3, java.sql.Date(dataCalendar.getTime())  ecc ecc


mi inserisce una data scorretta del genere:

12/03/12    nel db risulta 12/03/0012   invece che 2012


Che suggerimento avresti in merito per memorizzarla correttamente e per poi effettuare l controllo tra date usando la data impostata con anno a due cifre???

Grazie come sempre   Occhiolino
Registrato
ctraversa
Jr. Member
**

Karma: +14/-7
Scollegato Scollegato

Messaggi: 155


Mostra profilo
« Risposta #5 inserita:: Luglio 03, 2012, 10:10:32 am »

Supponiamo di avere i 2 casi:

CASO 1. La tua variabile annoMovimento vale 2012 per cui l'errore sta nel fatto che con l'insert ti ostini a voler salvare sul DB l'anno a due sole cifre. Fai semplicemente
Codice:
// Calendar per creare la data
Calendar dateCalendar = new GregorianCalendar();

dateCalendar.set(Calendar.DAY_OF_MONTH, giornoMovimento);
dateCalendar.set(Calendar.MONTH, meseMovimento);
dateCalendar.set(Calendar.YEAR, annoMovimento);
........
ps.setDate(3, java.sql.Date(dataCalendar.getTime());
memorizzando l'anno 2012 a 4 cifre

CASO 2. La tua variabile annoMovimento vale 12. In tal caso trovi un modo per farlo diventare 2012. Ad esempio (poichè dovrebbe trattarsi di un int) gli sommi 2000. Se ci dovessero essere anni precedenti al 2000 inventati qualche controllo che possa far diventare l'anno 19xx (v. di seguito). Dopodichè ti sei riportato al caso 1.

In questo modo sul DB la data sarà sempre corretta e poi con le successive select filtrerai come serve a te. Se dovessi avere problemi a fare una select con le date aventi l'anno a due sole cifre poichè sul DB sono memorizzate a 4 allora ti do il seguente consiglio cha comunque è valido in generale.

Crea una classe DBUtils con un metodo statico del tipo
Codice:
public static int function getAnnoCompleto (int anno) { //dove anno è l'anno a 2 cifre)
    int retVal;
    Calendar currDate = new GregorianCalendar();
    int currAnno = currDate.get(Calendar.YEAR);
    if (anno >= 0 || anno <= currAnno ) {
        //non credo avrai movimenti con anni precedenti al 1912
        retVal = anno + 2000;
    } else {
        retVal = anno + 1900;        
    }
    return retVal;
}

In questo modo nella select se hai l'anno a 2 cifre lo converti a 4 facendo semplicemente
DBUtils.getAnnoCompleto(anno)
sia per l'insert che per la select sia per tutti gli altri casi che si possono presentare

Inoltre in questa classe ci potrai mettere tutti i metodi che di volta in volta ti potranno servire per operare sul DB. Questa sarà una classe che ti potrà sempre tornare utile nel tuo lavoro ogni qualvolta dovrai fare operazioni o conversioni particolari sui DB.
Registrato
SHARKSEAL
Newbie
*

Karma: +0/-0
Scollegato Scollegato

Messaggi: 46


Mostra profilo
« Risposta #6 inserita:: Luglio 05, 2012, 12:49:31 am »

Come sempre impeccabile

Grazie di cuore ... provò e ti faccio sapere  Occhiolino

Registrato
Pagine: [1]   Vai su
  Stampa  
 
Vai a:  

Copyright © 2011 Edizioni Master SpA. p.iva : 02105820787

Tutti i diritti di proprietà letteraria e artistica riservati. - Privacy



Links to Page