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

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?

1 curtida

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

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?

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.

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…

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.

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?

Que BD usas? Não deveria ser DATETIME?

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

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.

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?

Correto.

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

Como coloco o tópico como [resolvido]?

  1. Edite o primeiro post.
  2. Coloque [Resolvido] no título;
  3. Clique em enviar.