[resolvido] Busca em banco utilizando java.sql.date apresenta todas as horas como 12:00

14 respostas
R

Caros usuários,

Estou fazendo uma busca em meu banco local derby e adicionando os dados coletados à uma lista

PreparedStatement ps = 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.

SimpleDateFormat sdf = new SimpleDateFormat("hh:mm:ss");
System.out.println("hora = " + sdf.format(DATAS.get(x).getTime()));

Alguem faz idéia do que está acontecendo?

14 Respostas

J

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:

PreparedStatement ps = conexao.prepareStatement("select data from datas where data &gt;= ? and data &lt;= ?");[  
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

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

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

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

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

Criei um código de teste que, acho eu, ilustra o que está acontecendo :

public static void main(String[] args) throws ParseException {
        Calendar dataCalendar = Calendar.getInstance();

        SimpleDateFormat df = new SimpleDateFormat("d/MM/yyyy - kk:mm:ss");
        
        java.sql.Date dataSQL = new java.sql.Date(dataCalendar.getTimeInMillis());
        
        Agendamento novoAgendamento = new Agendamento();
        novoAgendamento.setData(dataSQL);
        System.out.println("Data e hora inseridas = " + df.format(novoAgendamento.getData()));
        
        AgendamentoDAOLocal novoAgendamentoDAOLocal = new AgendamentoDAOLocal();
        novoAgendamentoDAOLocal.inserir(novoAgendamento);
        List<Agendamento> lista = novoAgendamentoDAOLocal.buscarTudo();

        for (int i = 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

public void inserir(Agendamento novoAgendamento) {
        SimpleDateFormat df = new SimpleDateFormat("d/MM/yyyy - kk:mm:ss");
        try {
            conexao = ConexaoBDLocal.abrirConexao();

            PreparedStatement ps = 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 (SQLException ex) {
            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

Que BD usas? Não deveria ser DATETIME?

R

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

http://db.apache.org/derby/papers/JDBCImplementation.html#Derby+SQL+DATE

V

De acordo com o manual do Derby, se você quiser guardar data e hora, deveria estar usando o tipo TIMESTAMP:
http://db.apache.org/derby/docs/10.1/ref/rrefsqlj27620.html

Sempre leia o manual com atenção, evita ter dores de cabeça como essa.

R

Obrigado a todos pela ajuda!

Entre gravar as datas como TimeStamp ou gravá-las com dois campos Date e Time, é mais eficiente gravá-las como timestamp, correto?

V

Correto.

R

Agora é entender por que me pediram para criar com Date…
Obrigado!

R

Como coloco o tópico como [resolvido]?

V
  1. Edite o primeiro post.
  2. Coloque [Resolvido] no título;
  3. Clique em enviar.
Criado 28 de janeiro de 2012
Ultima resposta 29 de jan. de 2012
Respostas 14
Participantes 4