JAVA converter data Timestamp

40 respostas
java
A

Bom dia, sou novo no fórum e também no java e estou literalmente aprendendo e gostando muito.
gostaria muito da ajuda dos veteranos, pois tenho um problema que não consigo resolver de jeito nenhum estou tentando pesquisar entre datas para trazer os clientes cadastrado de certo período, mas sempre fala que preciso converter eu já fiz varias pesquisa mas sem sucesso.
Meu comando no sql funciona ele converte mas na aplicação não alguém consegue me ajudar nessa questão? por favor.

40 Respostas

L

Como vc está fazendo a consulta?

A

Bom dia, lucas confesso que estou perdido e mesmo pesquisando acabei indo por instinto .
esse meu sql

select
	FILIAL,
	CLIENTE_VAREJO,
	CPF_CGC,
	DDD,
	TELEFONE,
	DDD_CELULAR,
	CELULAR,
	email
from
	CLIENTES_VAREJO
where FILIAL like '%" + mod.getPesquisa() + "%'
and CADASTRAMENTO between '%" + mod.getDataIN() + "%' and '%" + mod.getDataFIN() + "%'
A

L

O que mod.getDataIN() retorna?

A

quando add esse campo ele vem a msg
que preciso converter

A

Conversion failed when converting date and/or time from character string

L

Pelo visto, vc não está usando Prepared Statements.

Recomendo que dê uma lida sobre prepared statement, pois vai resolver seu problema. Veja um exemplo:

String updateString = "update " + dbName + ".COFFEES set SALES = ? where COF_NAME = ?";
PreparedStatement updateSales = con.prepareStatement(updateString);
updateSales.setInt(1, 1);
updateSales.setString(2, "someValue");

updateSales.executeUpdate();

Para datas, vc pode usar o PreparedStatement.setDate passando um java.sql.Date.

A

se eu tirar o campo eu consigo trazer
a data formatada.

A

A
PreparedStatement pst = conex.con.prepareStatement(select * from CLIENTES_VAREJO);

pst.setString(1, mod.getFILIAL());

pst.execute();

} catch (SQLException ex){

JOptionPane.showMessageDialog(null, “Consulta executada!/nErro:+ex);

}

conex.desconecta();

}
A

public BeansCliente buscaCliente(BeansCliente mod){
conex.conexao();

conex.executaSql(“select FILIAL,CLIENTE_VAREJO,CPF_CGC,DDD,TELEFONE,DDD_CELULAR,CELULAR,email,convert(varchar(10),cadastramento,103) as 'CADASTRAMENTO’from CLIENTES_VAREJO where FILIAL like '%”+mod.getPesquisa()+"%’");

try {
        conex.rs.first();
       // mod.setID(conex.rs.getInt("ID"));
        mod.setFILIAL(conex.rs.getString("FILIAL"));
        mod.setCLIENTEVAREJO(conex.rs.getString("CLIENTE_VAREJO"));
        mod.setCPF(conex.rs.getString("CPF_CGC"));
        mod.setDataIN(conex.rs.getTimestamp("CADASTRAMENTO"));
        mod.setDataFIN(conex.rs.getTimestamp("CADASTRAMENTO"));
      //  mod.setDataIN(new java.sql.Date(mod.getDataIN().getTime()));
       // mod.setDataFIN(new java.sql.Date(mod.getDataIN().getTime()));
        mod.setDDD(conex.rs.getString("DDD"));
        mod.setTELEFONE(conex.rs.getString("TELEFONE"));
        mod.setDDDCELULAR(conex.rs.getString("DDD_CELULAR"));
        mod.setCELULAR(conex.rs.getString("CELULAR"));
        mod.setEmail(conex.rs.getString("email"));  
      
        
        
    } catch (SQLException ex) {
        JOptionPane.showMessageDialog(null, "Erro ao Buscar Cliente!/nErro:"+ex);
    }
conex.desconecta();
    return mod;
 }
L

Não concatene os parâmetros na sql. Se os parâmetros com o prepared statement.

ps.setDate(1, new java.sql.Date(dataInicio.getTime()));
ps.setDate(2, new java.sql.Date(dataFim.getTime()));

Nesse exemplo, dataInicio e dataFim são instâncias de java.util.Date. Mas vc ainda não disse o que mod.getDataIN() retorna.

L

A solução que estou dizendo é essa: (como digitei aqui no notepad, capaz que tenha algum erro)

StringBuilder sql = new StringBuilder();
sql.append("SELECT ");
sql.append("	filial, ");
sql.append("	cliente_varejo, ");
sql.append("	cpf_cgc, ");
sql.append("	ddd, ");
sql.append("	telefone, ");
sql.append("	ddd_celular, ");
sql.append("	celular, ");
sql.append("	email ");
sql.append("FROM CLIENTES_VAREJO ");
sql.append("WHERE filial LIKE ? ");
sql.append("AND cadastramento BETWEEN ? AND ?");

PreparedStatement ps = con.prepareStatement(sql.toString());
ps.setString(1,"%" + mod.getFILIAL() + "%");
ps.setDate(2, new java.sql.Date(dataInicio.getTime()));
ps.setDate(3, new java.sql.Date(dataFim.getTime()));

ResultSet rs = ps.execute();

Nesse exemplo, dataInicio e dataFim são instâncias de java.util.Date .

A

entendi vou tentar

A

man, desculpa minha falta de conhecimento mas esta dando um erro :slight_smile:{

A

A

desculpa man o forum me bloqueou so podia trocar 20 msg

A

meu DAO.

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package ModeloDao;

import java.sql.PreparedStatement;
import java.sql.SQLException;
import javax.swing.JOptionPane;
import modeloBeans.BeansCliente;
import modeloConection.ConexaoBD;

/**
 *
 * @author alexandro.bueno
 */
public class DaoCliente {

     ConexaoBD conex = new ConexaoBD();
    BeansCliente mod = new BeansCliente();
    private Object dataInicio;
    private Object dataFim;



     public void ConsultaGeral(BeansCliente mod){
        conex.conexao();
        try {
  
          PreparedStatement pst = conex.con.prepareStatement("select * from CLIENTES_VAREJO");
           
           pst.setString(1, mod.getFILIAL());
           pst.setDate(2,new java.sql.Date(mod.getDataIN().getTime()));
           pst.setDate(3,new java.sql.Date(mod.getDataFIN().getTime()));
   
            
            pst.execute();
        } catch (SQLException ex){
            JOptionPane.showMessageDialog(null, "Consulta executada!/nErro:"+ex);
        }
        conex.desconecta();
     }
     
                           ///////////////////////////////////////////////////////////////
                           ////////////////////////////////////////////////////////////////
     public BeansCliente buscaCliente(BeansCliente  mod){
    conex.conexao();
   

 /conex.executaSql("select FILIAL,CLIENTE_VAREJO,CPF_CGC,DDD,TELEFONE,DDD_CELULAR,CELULAR,email,convert(varchar(10),cadastramento,103) as 'CADASTRAMENTO'from CLIENTES_VAREJO where FILIAL like '%"+mod.getPesquisa()+"%'");


        try {
            conex.rs.first();
           // mod.setID(conex.rs.getInt("ID"));
            mod.setFILIAL(conex.rs.getString("FILIAL"));
            mod.setCLIENTEVAREJO(conex.rs.getString("CLIENTE_VAREJO"));
            mod.setCPF(conex.rs.getString("CPF_CGC"));
          mod.setDataIN(conex.rs.getDate("CADASTRAMENTO"));
          mod.setDataFIN(conex.rs.getDate("CADASTRAMENTO"));
         //mod.setDataIN(conex.rs.getTimestamp("CADASTRAMENTO"));
         // mod.setDataFIN(conex.rs.getTimestamp("CADASTRAMENTO"));
           // mod.setDataIN(new java.sql.Date(mod.getDataIN().getTime()));
          //  mod.setDataFIN(new java.sql.Date(mod.getDataFIN().getTime()));
            mod.setDDD(conex.rs.getString("DDD"));
            mod.setTELEFONE(conex.rs.getString("TELEFONE"));
            mod.setDDDCELULAR(conex.rs.getString("DDD_CELULAR"));
            mod.setCELULAR(conex.rs.getString("CELULAR"));
            mod.setEmail(conex.rs.getString("email"));  
          
            
            
        } catch (SQLException ex) {
            JOptionPane.showMessageDialog(null, "Erro ao Buscar Cliente!/nErro:"+ex);
        }
    conex.desconecta();
        return mod;
     }
}
L

Nessa consulta de clientes, vc passou parâmetros no preparedStatement, mas não colocou no SQL. Deveria ser algo assim:

select * from CLIENTES_VAREJO WHERE filial = ? AND suaData BETWEEN ? AND ?

É uma interrogação para cada parâmetro informado.


Já sobre erro, imagino que seja ao recuperar a data do resultSet:

mod.setDataIN(conex.rs.getDate("CADASTRAMENTO"));
mod.setDataFIN(conex.rs.getDate("CADASTRAMENTO"));

Qual o tipo da coluna CADASTRAMENTO na tabela CLIENTES_VAREJO ?

A

datetime

L

Tenta assim:

Timestamp timestampIN = resultSet.getTimestamp("CADASTRAMENTO");
mod.setDataIN(new java.util.Date(timestampIN.getTime()));
A


dessa forma?

A

L

Não mande a imagem do código. Copie e cole o código para facilitar.

Quando estiver dando algum erro, diga qual foi. Não dá para saber exatamente o problema soh com a imagem.

De qual pacote é essa classe Timestamp que vc está usando?

A

putz…Desculpa man. sou novo nisso…rsrs.

A

L

Tranquilo. Digo msm para já ir acostumando e agilizando para os dois lados (o seu e das pessoas que podem te ajudar).

L

Mas então, essa classe que tu usou Timestamp, é do pacote java.sql? E onde vc declarou esse resultSet? Não deveria ser conex.rs.getTimestamp ?

A

Lucas eu consegui trazer na tela a data convertida, mas nao consigo fazer o filtro das datas. Vc tem uma ideia de como posso fazer?

Ja tentei:

PreparedStatement pst = conex.con.prepareStatement("select FILIAL,CLIENTE_VAREJO,CPF_CGC,DDD,TELEFONE,DDD_CELULAR,CELULAR,email,convert(varchar(10),cadastramento,103) as 'CADASTRAMENTO'from CLIENTES_VAREJO where FILIAL like '%"+mod.getPesquisa()+"%' and cadastramento ? and ?");

“?” and “?”

L

O sql parece que está errado nessa parte:

and cadastramento ? and ?

Acho que faltou o between:

AND cadastramento BETWEEN ? AND ?
A

coloquei o sql dessa forma
select FILIAL,CLIENTE_VAREJO,CPF_CGC,DDD,TELEFONE,DDD_CELULAR,CELULAR,email,convert(varchar(10),cadastramento,103) as 'CADASTRAMENTO’from CLIENTES_VAREJO where FILIAL like ‘%"+mod.getPesquisa()+"%’ and cadastramento between ? and ?

ele retornou
Unexpected parameter marker at position 206

L

Vc setou os parâmetros no PreparedStatement? Ex.:

PreparedStatement pst = // aqui é criado o prepared statement
pst.setDate(1, <<data início vem aqui>>);
pst.setDate(2, <<data final vem aqui>>);
A

bom dia, sim .

A

mas Lucas tem algo errado…kkkk seu deixar so o campo de filial no sql ele me traz a data ja convertida na data que preciso.
mas quando tento trazer mais o campo de data ele diz que não consegue converter
oque acha que pode ser;

L

Não entendi. Vc diz:

E depois

Como assim, trazer mais? Pelo que vi, o select eh o mesmo, com diferença apenas no where.

A

o filtro que faço é no select ceto? exemplo:

("select FILIAL,CLIENTE_VAREJO,CPF_CGC,DDD,TELEFONE,DDD_CELULAR,CELULAR,email,convert(varchar(10),cadastramento,103) as 'CADASTRAMENTO'from CLIENTES_VAREJO where FILIAL like '%"+mod.getPesquisa()+"%'");

agora se eu adicionar mais campos que seria a data ele reclama de conversão. EX:

("select FILIAL,CLIENTE_VAREJO,CPF_CGC,DDD,TELEFONE,DDD_CELULAR,CELULAR,email,convert(varchar(10),cadastramento,103) as 'CADASTRAMENTO'from CLIENTES_VAREJO where FILIAL like '%"+mod.getPesquisa()+"%' and cadastramento between '?' and '?'");
A

eu posso te mandar o print pra ficar so mais fácil de explicar?

L

Ah mano, agora que reparei nesse convert que tu faz:

convert(varchar(10),cadastramento,103)

Não precisa disso não. O correto é retornar a data na forma como ela é armazenada, com isso, ao converter para um objeto Date no java, deve funcionar.

E vc está usando os parâmetros do preparedStatement errado. Não precisa dessas aspas nas interrogações do between. A ideia dessas interrogaações na sua consulta é para evitar fazer concatenações da forma como vc está fazendo. Mude sua consulta para ficar assim:

String query = "SELECT FILIAL, CLIENTE_VAREJO, CPF_CGC, DDD, TELEFONE, DDD_CELULAR, CELULAR, email, cadastramento from CLIENTES_VAREJO where FILIAL like ? and cadastramento between ? and ?";

Viu como fica mais limpo. Bem melhor do que usar concatenação. E para setar os parâmetros, basta fazer isso:

PreparedStatement pst = connection.prepareStatement(query);
pst.setString(1, "%" + mod.getPesquisa() + "%");
pst.setDate(2, <<data início vem aqui como java.sql.Date>>);
pst.setDate(3, <<data final vem aqui como java.sql.Date>>);
A

select FILIAL,CLIENTE_VAREJO,CPF_CGC,DDD,TELEFONE,DDD_CELULAR,CELULAR,email,convert(varchar(10),cadastramento,103) as 'CADASTRAMENTO’from CLIENTES_VAREJO where FILIAL like ‘%"+mod.getPesquisa()+"%’");

estou usando esse comando no sql ai a data esta convertida no campo cadastro certo?

L

Entendi, mas o certo é recuperar a data do jeito que está no banco e depois formatar no código java para o formato que tu precisar.

A

entendi! faz sentido.

Criado 11 de agosto de 2020
Ultima resposta 13 de ago. de 2020
Respostas 40
Participantes 2