[resolvido] Busca em banco utilizando java.sql.date apresenta todas as horas como 12:00
14 respostas
R
rafaelvalle
Caros usuários,
Estou fazendo uma busca em meu banco local derby e adicionando os dados coletados à uma lista
PreparedStatementps=conexao.prepareStatement("select data from datas where data >= ? and data <= ?");[ps.setString(1,dataInicio);ps.setString(2,dataFim);// adicionar registros à lista DATAS
o campo data no banco é do tipo java.sql.Date
Quando faço um println para ver as horas, todas aparecem como 12:00:00, quando na verdade foram inseridas no banco de dados com horas diversas.
Se na sua estrutura do Banco de Dados os campos são do tipo Date porque na hora de vc gravar vc ta passando
uma String!?
Já que são Date grave-os como tal:
PreparedStatementps=conexao.prepareStatement("select data from datas where data >= ? and data <= ?");[ ps.setDate(1,dataInicio); ps.setDate(2,dataFim);
Nesse caso as variaveis dataInicio e dataFim devem ser do tipo java.sql.Date ou java.util.Date.
R
rafaelvalle
Pois é…
Tentei fazer o limite de seleção de DATAS ( data >=? and data <=? ) com a classe Date mas não funcionou.
Por isso utilizei a String.
De qualquer forma, acredito que o tipo de objeto que passo na busca (String, Date, Timestamp) influencia apenas de que forma vou coletar as Datas, não a hora das mesmas.
Certo?
J
jweibe
Pois eh!! qual o formato de Data que vc esta gravando no Banco? isso vai influenciar na sua consulta.
Tipow… eu ja tiver que trabalhar com datas que foram gravadas no banco como String e sempre
quando preciso fazer isso eu uso alguma função especifica do banco pra converter a String em data.
R
rafaelvalle
No banco as datas estão gravadas no formato Date.
Como disse, passo String para o DAO porque a busca de um período de tempo não funcionou passando duas Dates…
A varredura está correta, mas, apesar de ter gravado as datas no banco com as horas certas - fiz teste com SimpleDateFormat(“kk:mm:ss”) - os Dates vem do banco com hora 12 PM ou 24…
Acho que de alguma forma as datas não estão sendo registradas com hora no banco…
J
jweibe
Quanto as datas vc ja tentou dar um select * from… so pra ver como estão vindo suas datas?
Quanto a gravação das horas, minutos e segundos vc pode passar um Timerstamp.getTime() no
construtor da classe java.sql.Date.
R
rafaelvalle
Criei um código de teste que, acho eu, ilustra o que está acontecendo :
publicstaticvoidmain(String[]args)throwsParseException{CalendardataCalendar=Calendar.getInstance();SimpleDateFormatdf=newSimpleDateFormat("d/MM/yyyy - kk:mm:ss");java.sql.DatedataSQL=newjava.sql.Date(dataCalendar.getTimeInMillis());AgendamentonovoAgendamento=newAgendamento();novoAgendamento.setData(dataSQL);System.out.println("Data e hora inseridas = "+df.format(novoAgendamento.getData()));AgendamentoDAOLocalnovoAgendamentoDAOLocal=newAgendamentoDAOLocal();novoAgendamentoDAOLocal.inserir(novoAgendamento);List<Agendamento>lista=novoAgendamentoDAOLocal.buscarTudo();for(inti=0;i<lista.size();i++){System.out.println("Retorno do banco de dados "+i+" = "+df.format(lista.get(i).getData().getTime()));}}
método inserir da classe AgendamentoDAOLocal
publicvoidinserir(AgendamentonovoAgendamento){SimpleDateFormatdf=newSimpleDateFormat("d/MM/yyyy - kk:mm:ss");try{conexao=ConexaoBDLocal.abrirConexao();PreparedStatementps=conexao.prepareStatement("INSERT INTO agendamentos (data) values(?)");ps.setDate(1,novoAgendamento.getData());System.out.println("novoAgendamento.getData() = "+df.format(novoAgendamento.getData()));ps.executeUpdate();ps.close();conexao.close();}catch(SQLExceptionex){Logger.getLogger("AgendamentoDAOLocal").log(Level.SEVERE,"SQLException: {0}",ex.getMessage());}}
O resultado do println:
run:
Data e hora inseridas = 29/01/2012 - 10:17:16 novoAgendamento.getData() = 29/01/2012 - 10:17:16
Retorno do banco de dados 0 = 29/01/2012 - 24:00:00
BUILD SUCCESSFUL (total time: 0 seconds)
Sugestões?
P
pmlm
Que BD usas? Não deveria ser DATETIME?
R
rafaelvalle
Estou usando Derby, e me parece que ele possui três tipos de dados temporais :
Date, Time e Timestamp.
Sendo que o date :
“Derby?s SQL DATE type represents a date in the form yyyy-mm-dd with no associated time zone information.”
De acordo com Derby JDBC Implementation Notes