Precedente :: Successivo |
Autore |
Messaggio |
ZioCrick Eroe in grazia degli dei

Registrato: 19/05/19 11:20 Messaggi: 89
|
Inviato: 18 Giu 2025 13:37 Oggetto: Gestione dei campi datetime e time di MySql |
|
|
Amici cari,
ho un problemino che sembra semplice ma ci sto cozzando la testa da settimane!
Qualcuno gentilmente mi sa dire come si fa in Java a convertire una stringa "2025-06-18 12:29" per salvarla in un campo datetime di MySql e una stringa "12:30" per salvarla in un campo time di MySql ?
Ovviamente anche come fare il contrario.
Grazie. |
|
Top |
|
 |
SverX Supervisor Macchinisti


Registrato: 25/03/02 12:16 Messaggi: 11806 Residenza: Tokelau
|
Inviato: 18 Giu 2025 16:39 Oggetto: |
|
|
spiega cosa hai tentato e cosa hai ottenuto, perché mi sembra strano che tu non possa usare semplicemente la stringa in formato ISO direttamente nel tuo SQL statement  |
|
Top |
|
 |
ZioCrick Eroe in grazia degli dei

Registrato: 19/05/19 11:20 Messaggi: 89
|
Inviato: 18 Giu 2025 17:48 Oggetto: |
|
|
Allora, in teoria è semplice.
Parlo del primo campo da gestire.
In una form ho un campo in cui l'utente (cioè io) deve introdurre una data, e un altro in cui inserisce ora e minuti.
Io li prelevo da programma e li compongo nella stringa che ho riportato "2025-06-18 12:29".
Poi tramite una PreparedStatement eseguo il executeUpdate per aggiornare un record di una tabella MySql.
Siccome ormai da anni uso MySql tramite i Recorset ho preparato una serie di metodi a cui passo un ArrayList<String> con i campi da aggiornare e un ArrayList<Object> con i valori da assegnare ad ogni campo.
Ho un metoto che mi costruisce la query e mi formatta i valori tramite la PreparedStatement.
Il problema è che non ho capito se per scrivere in un campo MySql di tipo datetime devo usare una variabile java di tipo java.util.Date o java.sql.Date o java.sql.Timestamp.
Inoltre sembra, se non ho sbagliato qualcosa nei vari passaggi da un metodo ad un altro che il instanceof java.sql.Date non funzioni e lo riconosca sempre come java.util.Date per cui mi tronca le ore e i minuti.
Spero di aver chiarito meglio la situazione anche capisco che senza vedere il codice non è semplice, ma riportare qui tutti i metodi coinvolti sarebbe troppo.  |
|
Top |
|
 |
jack.mauro Dio minore


Registrato: 07/02/15 17:44 Messaggi: 534
|
Inviato: 18 Giu 2025 18:27 Oggetto: |
|
|
Scrivendo le query direttamente (e quindi trasformando le date in stringa per comporre l'sql) dovrebbe funzionare così, supponendo dataevento di tipo DATETIME:
Codice: | INSERT INTO eventi (data_evento) VALUES ('2025-06-18 19:00:00');
UPDATE eventi SET data_evento = '2025-06-18 20:30:00' WHERE id = 1;
INSERT INTO eventi (data_evento) VALUES (STR_TO_DATE('18/06/2025 19:00:00', '%d/%m/%Y %H:%i:%s'));
UPDATE eventi SET data_evento = STR_TO_DATE('18/06/2025 20:30:00', '%d/%m/%Y %H:%i:%s') WHERE id = 1; |
Ovviamente senza conoscere il tuo "framework" per preparare le query è difficile essere più precisi... |
|
Top |
|
 |
ZioCrick Eroe in grazia degli dei

Registrato: 19/05/19 11:20 Messaggi: 89
|
Inviato: 18 Giu 2025 19:07 Oggetto: |
|
|
Bravo Mauro!
Hai percepito giusto, perché sto cercando di realizzare un programma che mi gestisca la mia agenda, perché ho esigenze particolari e non voglio usare nulla sul web.
Infatti sto litigando con l'inserimento e la modifica della data e la durata di un evento.
Di fatto le istruzioni SQL che hai scritto vanno benissimo usando phpMyAdmin per agire direttamente sul db MySql.
Da java invece, come ho cercato di spiegare prima, utilizzo i recordset, e quindi creo la query da programma e la passo al PreparedStatement che esegue la executeUpdate, ma prima devo formattare i campi in funzione del tipo di campo, quindi passo ad un mio metodo un argomento con la PreparedStatement e uno con un ArrayList<Object> che contiene i valori da assegnare ai campi della query.
In questo metodo uso dei test del tipo:
Codice: | if (aoWhrVal.get(jj) instanceof java.sql.Time) {
ps.setTime(jj+1, (java.sql.Time) aoWhrVal.get(jj));
}
| dove jj è l'indice del aoWhrVal che è l'ArrayList<Object> che contiene i valori dei campi.
Ma sembra che se uso instanceof java.util.Date mi taglia la parte di ore e minuti, se invece uso instanceof java.sql.Date non me la riconosce. |
|
Top |
|
 |
jack.mauro Dio minore


Registrato: 07/02/15 17:44 Messaggi: 534
|
Inviato: 19 Giu 2025 09:52 Oggetto: |
|
|
Non conosco Java ne i PreparedStatement, ma anziché setDate (che setta la sola data senza ora) e setTime (che setta la sola ora senza la data) penso tu debba usare setTimestamp anche se la colonna è datetime e non timestamp su mysql.
Codice: | LocalDateTime dateTime = LocalDateTime.of(2025, 6, 19, 14, 30);
Timestamp timestamp = Timestamp.valueOf(dateTime);
ps.setTimestamp(..., timestamp); |
Ciao
Mauro |
|
Top |
|
 |
ZioCrick Eroe in grazia degli dei

Registrato: 19/05/19 11:20 Messaggi: 89
|
Inviato: 21 Giu 2025 10:28 Oggetto: |
|
|
Dopo varie prove, modifiche e ...bip... bip...
credo di aver risolto usando in java:
il tipo java.sql.Timestamp per il campo MySql DateTime
il tipo java.sql.Time per il campo MySql Time.
Al momento sembra funzionare.  |
|
Top |
|
 |
|