Recuperar campo datetime do mysql

21 respostas
J

Gostaria de saber como faço para recuperar um campo datetime do MySql.

21 Respostas

P

Olá jorge,

Trabalhar com datas em Java e MySQL é meio chatinho…
Eu tenho uma classe que recebi de um membro aqui do forum que uso sempre e é muito legal…ela faz a conversão de data do MySql que é formato iso para formato abnt brazil e vice versa…

mas para pegar o valor de um campo date time do MySql eu uso String data=rs.getString(“Campo_Data”); porem éla virá escrita como 2010-26-07 hh:mm:ss…por isso uso essa classe para conversão ok!

posso te passar por e-mail ok!

me passe seu e-mail…

Araço T+

R

Assim ele trás todas as datas que tiverem assim no banco: 2010-07-26 00:00:00

SELECT * FROM `tabela` WHERE data_hora = '2010-07-26'

ou

Para trazer exatamente a data e hora informada:

SELECT * FROM `tabela` WHERE data_hora = '2010-07-26 11:58:20'
J

Então fiz exatamente como vc disse, pego a data em formato string e depois recebo um exception.

Se puder me manda a classe no meu email [email removido].

Grato

J

romarcio quando formato a data bonitinha assim na string sql nao tenho problemas, porem como as datas vem de variaveis não tem como eu formata-las deste modo.

R

Faz algo do tipo:

private Date getDataFormatted(final String dataSt) throws Exception {
        //data eh recebida assim: 26/07/2010 06:05:20

        Date data = null;
        try {
            DateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
            //transformar em 2010/07/26 06:05:20 como no banco de dados

            String dataTemp = dataSt.substring(6, 10) +  dataSt.substring(2, 6)  + dataSt.substring(0, 2) + dataSt.substring(10, 19);

            data = dateFormat.parse(dataTemp);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return data;
    }
J

romarcio mesmo com a implementação da sua classe segue o print do erro apresentado.

R

No Mysql a coluna em questão está criada como DateTime ou TimeStamp?

Se estiver como DateTime não deveria haver problemas.

E o atributo na sua classe deve ser do tipo Date.

J

Esta como datetime mesmo.
abaixo segue o log do erro:

SEVERE: java.text.ParseException: Unparseable date: 3-1809-020 17:42:49

at java.text.DateFormat.parse(DateFormat.java:337)

at dt.FormatData.getDataFormatted(FormatData.java:18)

at db.OcomonDB.consultarpornome(OcomonDB.java:123)

at servlet.TelaResultPesqServlet.processRequest(TelaResultPesqServlet.java:47)

at servlet.TelaResultPesqServlet.doGet(TelaResultPesqServlet.java:77)

at javax.servlet.http.HttpServlet.service(HttpServlet.java:734)

at javax.servlet.http.HttpServlet.service(HttpServlet.java:847)

at org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1523)

at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:343)

at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:215)

at org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:390)

at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:256)

at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:215)

at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:277)

at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:188)

at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:641)

at com.sun.enterprise.web.WebPipeline.invoke(WebPipeline.java:97)

at com.sun.enterprise.web.PESessionLockingStandardPipeline.invoke(PESessionLockingStandardPipeline.java:85)

at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:185)

at org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:332)

at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:233)

at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:165)

at com.sun.grizzly.http.ProcessorTask.invokeAdapter(ProcessorTask.java:791)

at com.sun.grizzly.http.ProcessorTask.doProcess(ProcessorTask.java:693)

at com.sun.grizzly.http.ProcessorTask.process(ProcessorTask.java:954)

at com.sun.grizzly.http.DefaultProtocolFilter.execute(DefaultProtocolFilter.java:170)

at com.sun.grizzly.DefaultProtocolChain.executeProtocolFilter(DefaultProtocolChain.java:135)

at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:102)

at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:88)

at com.sun.grizzly.http.HttpProtocolChain.execute(HttpProtocolChain.java:76)

at com.sun.grizzly.ProtocolChainContextTask.doCall(ProtocolChainContextTask.java:53)

at com.sun.grizzly.SelectionKeyContextTask.call(SelectionKeyContextTask.java:57)

at com.sun.grizzly.ContextTask.run(ContextTask.java:69)

at com.sun.grizzly.util.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:330)

at com.sun.grizzly.util.AbstractThreadPool$Worker.run(AbstractThreadPool.java:309)

at java.lang.Thread.run(Thread.java:619)

ta mto estranho este erro !!!

R

O erro ta no formato da data: 3-1809-020 17:42:49

Tem que ver da onde está vindo esse formato estranho, se vc está usando o método que lhe passei antes, o formato recebido pelo parametro deve ser assim: 26/07/2010 06:05:20, então veja se ele está mesmo recebendo a data deste modo para converter para o padrão do mysql.

Outra coisa, tenha certeza que o Date seja importado do java.util.Date, e não do java.sql.Date.

J

romancio ele transforma o conteudo da variavel neste formato apos passar pelo seu metodo. Continuo com o erro, ja fiz de td e nao consegui soluciona-lo

R

Seguinte, acho que entendi mal.

Você precisa recuperar a data do banco ou salvar a data no banco?

Se for salvar, o método que te passei funciona OK, pq uso ele em uma aplicação de testes que tenho.

Se for recuperar a data para exibir formatada assim: 26/10/2010 19:10:59, dai pode usar esse método:

//recebida como 2010-07-26 06:05:20
    //transformar em 26-07-2010 06:05:20
    private String formatData(Date dataHora) {
        DateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss");
        String newDate = dateFormat.format(dataHora);
        return newDate;
    }

Caso seja mesmo salvar em banco, dai eu só poderia te ajudar se desse uma olha no seu sistema, para entender pq não está dando certo.

J

romancio agora a aplicação apresenta o erro conforme o print.
vc me dizer a causa?

R

jorge.david:
romancio agora a aplicação apresenta o erro conforme o print.
vc me dizer a causa?

Acredito que esse erro seja pq foi importado o pacote java.sql.Date e não o java.util.Date.

Da uma conferida nos imports que vc fez nas classes que trabalha com atributos do tipo Date.

J

Foi a primeira coisa que eu olhei… porem todos os imports estão apontando para java.util.date…

R

Posta a tua classe de conexão, classe e classe onde tem os metodos envolvidos.

E o log de erro.

J

Segue em anexo as classes…

R

Olha só:

public class FormatarData {

    //recebida como 2010-07-26 06:05:20
    //transformar em 26-07-2010 06:05:20
    public String getFormatDateToStringToExibir(Date dataHora) {
        DateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss");
        String newDate = dateFormat.format(dataHora);
        return newDate;
    }

    //recebida como 26-07-2010 06:05:20
    //transformar em 2010-07-26 06:05:20
    public String getFormatDateToStringToInserirDB(Date date) {
        DateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
        String newDate = dateFormat.format(date);
        return newDate;
    }
}

Dai para exibir:

FormatarData fdt = new FormatarData();

            while (rs.next()) { 
                ...
                String data =  fdt.getFormatDateToStringToExibir(rs.getDate(5)); 
            }

O que acontece, o resultSet quando feito assim: rs.getDate() retorna um Date do tipo java.sql.Date por isso dava o erro. Então faz ele enviar direto para uma String ao invés de fazer isso:

Date dt = rs.getDate("data_abertura");

                FormatData d = new FormatData();

                String dta = d.formatData(dt);
R

Vc pode fazer assim tambem:

while (rs.next()) { //anda de registro em registro ate o final da tabela
                //Trabalhando com string
                String dt = fmt.getDataFormatada(rs.getString("data_abertura"));
                System.out.println(dt);
            }

    //caso não queira retornar a hora, retire do método essa parte:  + data.substring(10, 19); 
    public String getDataFormatada(String data) {
        String newDate = data.substring(8, 10) +"/"+data.substring(5, 7)+"/"+data.substring(0, 4) + data.substring(10, 19);
        return newDate;        
    }
J

Cara ta complicado. Nunca pensei que fosse tão dificl mexer com campos dataTime em java.
esta acontecendo o mesmo erro.
Em anexo estao todas as minhas classes .java
Tem como vc verificar se eu estou fazendo algo de errado?

R

Baxei seus arquivos, e fiz o seguinte:

Na classe OcomonDB no método consultarpornome eu alterei:

String data_abertura =  fdt.getFormatDateToStringToExibir(rs.getDate("data_abertura"));

por

String data_abertura =  fdt.getFormatDateToStringToExibir(rs.getString("data_abertura"));

e na classe FormatData eu alterei:

public String getFormatDateToStringToExibir(Date data) {
     DateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss");
         String newDate = dateFormat.format(data);
         //String newDate = data.substring(8, 10) +"/"+data.substring(5, 7)+"/"+data.substring(0, 4) + data.substring(10, 19);
         return newDate;
    }

por

public String getFormatDateToStringToExibir(String data) {
        String newDate = data.substring(8, 10) +"/"+data.substring(5, 7)+"/"+data.substring(0, 4) + data.substring(10, 19);
        return newDate;
    }

E funcionou, não gerou erro algum, a data passa a ser mostrada assim: 02/08/2010 15:44:02.

J

Cara obrigado.
Fiquei algum tempo fora do forum por motivos de trabalho e estudos.
Mas o problema foi solucionado !!!

Criado 26 de julho de 2010
Ultima resposta 21 de set. de 2010
Respostas 21
Participantes 3