Java + SQL e parseamento de datas

Bom dia.

Estou com uma dúvida.

Tenho um campo no meu banco como datetime, preciso fazer um Update na tabela…
Problema: Como enviar a data no formato correto para o banco?

Datetime me retorna : 2011-01-26 hh:mm:ss.mmm
Queria algo neste formato para enviar ao banco!!

Como faço isso ?

Não tá usando hibernate, né?
Dependendo o banco de dados, caso vc passe como argumento a função “now()”, estará informando a data e hora atuais.
Sei que no oracle não funciona (a função tem outro nome)

Bom… Você pode usar um DateFormat da vida, se você está escrevendo os SQLs na mão, apenas com Strings…
Mas acho que se você usar um PreparedStatement, você só precisa usar um stmt.setDate(…) e pronto.

Att.,

É bom postar o código né :slight_smile:
Desculpem!!

Segue o código do método da classe que manipula a inserção:



    public void InsereResultado() {

        String comando = "Update tblRegistro Set Resultado = ? AND Situacao = ? Where ProtocoloID = '"+ form.getProtocolo() +"'";

        PreparedStatement p;
        try {

            p = this.cx.fazConexao().prepareStatement(comando);
            p.setString(1, form.getResultado());
            p.setString(2, "2");

            p.execute();



        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

Eu tinha feito uma trigger no banco, mas devido a outra que eu já criei, ele dispara automático e não quero isso!!
Eu quero atualizar também o campo dataFinal que é um datetime e está NULL no banco…

Alguém sabe?

Ajuda ae!!

Você está alterando o código, certo?
Qual o banco de dados?
Você pode usar, como dito pelo eltonads, um dateformat ou qubrar na mão mesmo e inserir.
Se a data a ser inserida, na atualização, é a atual, coloca logo um now() e pronto.

Criar método now() em Suporte.Login

o.O

importo algo?

Na verdade tenho este modificador:

String formato = "yyyy-MM-dd HH:mm:ss.SSS";
        SimpleDateFormat formatter = new SimpleDateFormat(formato);
        System.out.println("A data formatada é: " + formatter.format(form.getDataFinal()));

O meu Update é esse:

 String comando = "Update tblRegistro Set Resultado = ?, Situacao = '2' Where ProtocoloID = ?";

Precisaria adicionar um campo para atualizar que é data e está no formato: yyyy-MM-dd HH:mm:ss.SSS
Como eu insiro isso no meu ‘comando’??

Segue o código do método todo:

public void InsereResultado() {


        String formato = "yyyy-MM-dd HH:mm:ss.SSS";
        SimpleDateFormat formatter = new SimpleDateFormat(formato);
        System.out.println("A data formatada é: " + formatter.format(form.getDataFinal()));


        String comando = "Update tblRegistro Set Resultado = ?, Situacao = '2' Where ProtocoloID = ?";

        try {
            PreparedStatement stmt = cx.fazConexao().prepareStatement(comando);
            stmt.setString(1, form.getResultado());
            stmt.setInt(2, form.getProtocolo());
           

            stmt.execute();
            stmt.close();
            JOptionPane.showMessageDialog(null, "Resultado inserido corretamente!");


        } catch (SQLException e) {
            e.printStackTrace();
            JOptionPane.showMessageDialog(null, "Resultado não inserido!\n\nConsulte o chamado e insira novamente.");
        }
    }

SQL basiquinho - Update:
Quando você executa um update, como está ali na query, precisa passar:
1 - o nome da coluna que será atualizada;
2 - o novo valor da coluna;
3 - cláusula where, indicando qual índice deverá ser alterado, caso contrário, todos os registros serão;

Sua query diz que as colunas resultado e situação serão anteradas enquanto o protocoloid é o que foi selecionado. Deve existir um campo com o nome data, suponhamos que ele seja dataAtual:

//código para converter a data aqui
//mais código aqui se preciso
 String comando = "Update tblRegistro Set Resultado = ?, Situacao = '2', dataAtual = ? Where ProtocoloID = ?";  
   
         try {  
             PreparedStatement stmt = cx.fazConexao().prepareStatement(comando);  
             stmt.setString(1, form.getResultado());  
stmt.setString(2, sua_variavel_com_a_nova_data_aqui);
             stmt.setInt(3, form.getProtocolo());  
   
             stmt.execute();  
             stmt.close();  
             JOptionPane.showMessageDialog(null, "Resultado inserido corretamente!");  
   
   
         } catch (SQLException e) {  
             e.printStackTrace();  
             JOptionPane.showMessageDialog(null, "Resultado não inserido!\n\nConsulte o chamado e insira novamente.");  
         }  

Siiim, sim…O problema não é bem este!!

Vamos lá:

Eu criei o formatador, ele formata a data ATUAL corretamente do jeito que eu quero inserir.
O problema é:

Como eu insiro isso no banco?
Se eu coloco formatter.format(data) no meu update ele não vai.
Se eu coloco data2 = formatter.format(data); e insiro data2 no meu update ele não vai também
O formato está correto, Update tá tranquilo, o problema está em COMO inserir a data!!

Como eu digo, em linhas de código =D

Converte em uma string e insere na query

Não. Insere como Date mesmo e não precisas de te preocupar com o formato.

A query é uma string, é isso que o banco vai receber como parâmetro. Independente do tipo de dados que você tem, o BD só vai saber do que se trata quando fizer a leitura do comando.
Acontece que se você passa a data formatada com o padrão brasileiro (dd/MM/yyyy) o BD não reconhece isto.
Se você instancia um objeto do tipo Date(), ele estará formatado da seguinte forma:

public static void main(String args[]){
        Date d = new Date();
        System.out.println(d);
    }

cuja saída seria:

Mon Jan 31 15:24:27 BRST 2011

O BD não compreende do que se trata, simplesmente irá retornar erro.

Por isso a necessidade de formatar a data para um pattern mais “ajeitado”.

Errado.

Datas devem ser inseridas como Date na DB exactamente para evitar os problemas do formato. Mais ou menos assim:

public void InsereResultado() {  
      
    String comando = "Update tblRegistro Set Resultado = ?, Situacao = ?, dataFinal = ? Where ProtocoloID = ?";  
      
    PreparedStatement p;  
 
   String formato = "yyyy-MM-dd";  // Formato no FORM  
   SimpleDateFormat formatter = new SimpleDateFormat(formato);  
   Date dataFinal = formatter.parse(form.getDataFinal()):

   try {  
      
            p = this.cx.fazConexao().prepareStatement(comando);  
            p.setString(1, form.getResultado());  
            p.setString(2, "2");  
            p.setDate(3, new java.sql.Date(dataFinal.getTime()));
            p.setString(4, form.getProtocolo();
     
            p.execute();  
     
     } catch (SQLException e) {  
           e.printStackTrace();  
     }  
}  

pmlm, valeu cara…
Mas olha o que deu!!

Cannot find symbol.
method parse(java.util.Date)
location: class java.text.SimpleDateFormat

Da esse erro.

O código ficou assim, após eu mudar apenas algumas coisinhas para se adequar ao meu necessário:

public void InsereResultado() {

        String comando = "Update tblRegistro Set Resultado = ?, Situacao = ?, dataFinal = ? Where ProtocoloID = ?";

    PreparedStatement p;

   String formato = "yyyy-MM-dd HH:mm:ss.SSS";  // Formato no FORM
   SimpleDateFormat formatter = new SimpleDateFormat(formato);
   Date dataFinal = formatter.parse(form.getDataFinal());

   try {

            p = this.cx.fazConexao().prepareStatement(comando);
            p.setString(1, form.getResultado());
            p.setString(2, "2");
            p.setDate(3, new java.sql.Date(dataFinal.getTime()));
            p.setInt(4, form.getProtocolo());

            p.execute();

     } catch (SQLException e) {
           e.printStackTrace();
     }
}

Concordo que datas devem ser inseridas como date e horas e afins com o formato adequado.
Eventualmente há a necessidade de persistir essa informação em um único campo ou, pior, o banco de dados já existe e o “bendito” sujeito que o desenvolveu implicou que seria assim.

Só para complementar, insira estes métodos no teu código e os chame para converter, como coloquei:

[code] public void InsereResultado() {

       String comando = "Update tblRegistro Set Resultado = ?, Situacao = ?, dataFinal = ? Where protocoloID = ?";  

 PreparedStatement p;  

String dataFinal = formatDate(form.getDataFinal());  

try {  

         p = this.cx.fazConexao().prepareStatement(comando);  
         p.setString(1, form.getResultado());  
         p.setString(2, "2");  
         p.setDate(3, new java.sql.Date(dataFinal.getTime()));  
         p.setInt(4, form.getProtocolo());  

         p.execute();  

  } catch (SQLException e) {  
        e.printStackTrace();  
  }  

}

public static String formatDate(Date data) {
return formatDate(data, “yyyy-MM-dd HH:mm:ss:SSS”);
}

public static String formatDate(Date data, String formato) {
    SimpleDateFormat sdf = new SimpleDateFormat(formato);
    return sdf.format(data);

}

[/code]

Pelo amor de Deus, não passem datas pro banco como String:!:

O preparedStatement já tem um método set(int, java.sql.Date), como mencionado acima, e é melhor utilizar esse quando for passar a data :slight_smile:

Se você quer passar a hora atual pra sua query: (o resto do código copia do de cima que ta certo)

//Pega a data/hora atual e insere no prepared statement preparedStatement.set(x, new java.sql.Date(new java.util.Date().getTime() ));

drigo, bom dia.

Cara, mas e como eu insiro a data FORMATADA do jeito que coloquei lá?
Eu até entendo o que estão dizendo, mas não consigo encontrar uma forma de inserir formatado.

Ele insere com getTime(), insere sem getTime(), mas ele dá erro na inserção, update e afins por que não está no formato correto.

Como eu insiro isso formatado? :open_mouth: