Gestione dei campi datetime e time di MySql

di il
4 risposte

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.

4 Risposte

  • Re: Gestione dei campi datetime e time di MySql

    Premessa: entrambe le tue stringhe non sono propriamente corrette, poichè entrambe mancano della componente dei secondi, che è presente sia nei campi DATETIME, che nei campi TIME di MySQL.
    Ma si può "sorvolare" questo problema, aggiungendo forzatamente l'informazione a zero o predisponendo gli appositi parser che lo faranno al posto nostro.
    Detto questo, quando si ha a che fare con i DB ci si deve sempre rivolgere alle PreparedStatement per avere il pieno controllo dei dati.

    Per quanto riguarda il tipo di dato DATETIME, esiste la controparte JDBC java.sql.Timestamp
    Per quanto riguarda il tipo di dato TIME, esiste la controparte JDBC java.sql.Time
    Entrambi estendono la classe java.util.Date per fornire al driver JDBC gli appositi meccanismi di conversione verso il tipo di dato specifico del DBMS.

    Entrambi questi Types prendono nel loro costruttore un istante temporale espresso in millisecondi, quindi tutto si riduce nel parsare le stringhe e costruire gli equivalenti oggetti Date.

    Vediamo come ottenere gli oggetti Date dalle tue due stringhe:

    // Converto stringhe nel formato "yyyy-MM-dd HH:mm"
    String strData = "2025-06-18 12:29";
    SimpleDateFormat sdData = new SimpleDateFormat("yyyy-MM-dd HH:mm");
    Date miaData = null;
    try {
       miaData = sdData.parse( strData );
    } catch (Exception e) {
       // La stringa non rappresenta una data nel formato atteso
    }
    // Converto stringhe nel formato "HH:mm"
    String strOra = "12:45";
    SimpleDateFormat sdOra = new SimpleDateFormat("HH:mm");
    Date miaOra = null;
    try {
       miaOra = sdData.parse( strOra );
    } catch (Exception e) {
       // La stringa non rappresenta un'orario nel formato previsto
    }
    

    A questo punto vado a fare gli inserimenti a DB:

    
    Connection con = ...;
    PreparedStatement pstmtData = null;
    PreparedStatement pstmtOra = null;
    try {
       pstmtData = con.prepareStatement("INSERT INTO Tabella(campo_data) VALUES(?)");
       pstmtData.setTimestamp(1, new java.sql.Timestamp(miaData.getTime()));
       pstmtData.executeUpdate();
       
       pstmtOra = con.prepareStatement("INSERT INTO Tabella(campo_ora) VALUES(?)");
       pstmtOra.setTimestamp(1, new java.sql.Time(miaOra.getTime()));
       pstmtOra.executeUpdate();
    } catch (Exception e) {
       logger.error("Errore inserendo i dati nel DB", e);
    } finally {
       if (pstmtOra != null) {
           try { pstmtOra.close(); } catch (Exception e) { }
       }
       if (pstmtData != null) {
           try { pstmtData.close(); } catch (Exception e) { }
       }
    }
    
  • Re: Gestione dei campi datetime e time di MySql

    Per il contrario basta leggerli dal DB e usare getTimestamp() e getTime() del ResultSet per ottenere i relativi oggetti Timestamp e Time... da poter passare agli stessi identici SimpleDateFormat per formattarli (ovviamente, usando il metodo format() )

  • Re: Gestione dei campi datetime e time di MySql

    Grazie mille per le indicazioni.

    Solo un chiarimento prima che metto a smanettare.

    Nella dichiarazione che hai riportato come:

    Date miaData = null;

    la Date di che tipo é?
    java.util.Date oppure java.sql.Date ?

    oppure la miaData non sarebbe da dichiarare come java.sql.Timestamp ?

    e invece per la variabile di tipo Time non bisognerebbe dichiararla come java.sql.Time ?

  • Re: Gestione dei campi datetime e time di MySql

    Sia miaData, che miaOra sono di tipo java.util.Date. Il metodo parse() del DateFormat ritorna un java.util.Date.

    Il java.sql.Date è infatti la classe JDBC usata per settare/ottenere i valori dei campi DATE del DMBS.

Devi accedere o registrarti per scrivere nel forum
4 risposte