Consulta entre datas

13 respostas
R

Estou tentando fazer uma consulta entre datas, mas esta ocorrendo alguns erros, alguém pode me ajudar ?, segue meu código.
Banco Mysql

public ListgetLista(String dataInicial, String dataFinal) throws SQLException {
String sql = “select * from movimentacao where data BETWEEN ? AND ?”;

PreparedStatement stmt = connection.prepareStatement(sql);
ResultSet rs = stmt.executeQuery();

stmt.setString(1, dataInicial);
stmt.setString(2, dataFinal);

List minhaLista = new ArrayList();

while(rs.next()){

Fornecedor c1 = new Fornecedor();

FornecedorDAO dao = new FornecedorDAO();
c1.setDoc(rs.getString(doc));

c1.setTipo_doc(rs.getString(tipo_doc));

c1.setNome(rs.getString(nome));

c1.setEndereco(rs.getString(endereco));

c1.setEmail(rs.getString(email));
//Date d = rs.getDate(“data”); // a data

//SimpleDateFormat sdf = new SimpleDateFormat(“dd/MM/yyyy”); // formato de data desejado

//String s = sdf.format(d); // data formatada

Calendar data = Calendar.getInstance();

data.setTime(rs.getDate(data));

c1.setData(data);
minhaLista.add(c1);

}

rs.close();

stmt.close();

return minhaLista;

}
}

Classe onde quero mostrar os dados.

public class listarFornecedor {

public static void main(String[] args) throws SQLException {

FornecedorDAO dao = new FornecedorDAO();

String dataInicial = null;

String dataFinal = null;

List minhaLista = dao.getLista(dataInicial, dataFinal);

dataInicial = JOptionPane.showInputDialog(“digite a data inicial”);
dataFinal = JOptionPane.showInputDialog(“digite a data final”);

for (Fornecedor fornecedor : minhaLista)

System.out.println(doc : +fornecedor.getDoc());

SimpleDateFormat sdf = new SimpleDateFormat(dd/MM/yyyy);

System.out.println(sdf.format( fornecedor.getData().getTime()));

System.out.println(tipo_doc : +fornecedor.getTipo_doc());

System.out.println(nome : +fornecedor.getNome());

System.out.println(endereco : + fornecedor.getEndereco());

System.out.println(email : +fornecedor.getEmail());

}

}

13 Respostas

P

Em primeiro lugar, aconselho a leres isto. Será muito mais fácil que depois alguém olhe para o teu código e te ajude.

E convém que digas que erros ou problemas estás a ter. "mas esta ocorrendo alguns erros" não diz nada sobre que erros estão a ocorrer e assim se torna dificil de ajudar.

Colocar na categoria certa também é importante e não me parece que isto seja de Java Avançado.

Finalmente, e não sei se esse será o único problema do teu código mas tens isto trocado:
RuanSjp:
PreparedStatement stmt = connection.prepareStatement(sql); 
ResultSet rs = stmt.executeQuery(); 

stmt.setString(1, dataInicial); 
stmt.setString(2, dataFinal);

O set dos parâmetros é antes da execução da query.

PreparedStatement stmt = connection.prepareStatement(sql); 

stmt.setString(1, dataInicial); 
stmt.setString(2, dataFinal); 

ResultSet rs = stmt.executeQuery();
P

E para as datas formatadas… (não sei como está no BD…) faça assim:

AND to_char( dt_sistema, 'DD/MM/YYYY') between ((?::varchar)) and ((?::varchar))

Assim uso para postgres, mas acho que para MySql funciona tbm

Y

n precisa formatar as datas, é só colocar o campo de data como Calendar e usar o stmt.setDate ao inves do setString

P

Pacato:
E para as datas formatadas… (não sei como está no BD…) faça assim:

AND to_char( dt_sistema, 'DD/MM/YYYY') between ((?::varchar)) and ((?::varchar))

Assim uso para postgres, mas acho que para MySql funciona tbm

Nem reparei nisso, mas essa é uma péssima dica.

Para datas deve usar o setDate e ter os campos no código como Date ou Calendar.
O único sítio onde deve haver formatação para String é na interface com o utilizador, onde se mostra ou se recolhem dados num determinado formato.

P

é.. como falei não sei como está pegando esta data... mas outras conversções que usei já foram:

Date dtAtivacao;
stmt.setDate(1, new java.sql.Date((dtAtivacao).getTime()));
e
Calendar horaAtual;

stmt.setTimestamp(1, new java.sql.Timestamp(horaAtual.getTimeInMillis()));
R

Galera valeu pelas dicas, avancei um pouco mas agora esta dando outro erro, segue abaixo o codigo e abaixo o erro. Banco Mysql

public ResultSet getLogin(Date data1, Date data2) throws Exception {

String sql = "SELECT * FROM fornecedor  WHERE data BETWEEN ? AND ?";
               PreparedStatement stmt = connection.prepareStatement(sql);
               
               Calendar c = Calendar.getInstance();
               c.set(Calendar.DAY_OF_MONTH, 20);
               c.set(Calendar.MONTH, 3);
               c.set(Calendar.YEAR, 2013);
                                      
               java.sql.Date dt = new java.sql.Date(c.getTimeInMillis());
               
               
                              
               
                
                stmt.setDate(1, (java.sql.Date) data1);
                stmt.setDate(2, (java.sql.Date) data2);
                
                
                stmt.setDate(1, dt);
                stmt.setDate(2, dt);
                
	  ResultSet rs = stmt.executeQuery();
	   return rs;
   }
public static void main(String[] args) throws SQLException, Exception {
    
                
          
    
    
   
   
   
   String retorno = JOptionPane.showInputDialog("digite data1");
   Date data1 = new SimpleDateFormat("dd/MM/yyyy").parse(retorno);
   
   String retorno1 = JOptionPane.showInputDialog("digite data1");
   Date data2 = new SimpleDateFormat("dd/MM/yyyy").parse(retorno1);
     
    Relatorio rel = new Relatorio();
    rel.getLogin(data1, data2);
    
    Relatorio relatorio = new Relatorio();
    
    ResultSet rs = relatorio.getLogin(data1, data2);
    
     while(rs.next()){
         
        System.out.println("doc :" +rs.getString("nome"));
        
        
    
     }

    
}

}

run:

Exception in thread main java.lang.ClassCastException: java.util.Date cannot be cast to java.sql.Date

at dao.Relatorio.getLogin(Relatorio.java:56)

at dao.Relatorio.main(Relatorio.java:82)

Java Result: 1

CONSTRUÍDO COM SUCESSO (tempo total: 15 segundos)
P

amigo, primeiro tente colocar seus códigos nas tags [code] e [/code

Você está começando a se confundir, tem date (da biblioteca sql, da útil), calendar...

Não está dando para entender o que você quer... explique melhor...

Quer consultar as datas no bd e pegar os valores do resultado? quer ver apensa se retorna ou não (boolean)?

Se você misturar muito as datas vai acabar se confundindo... pois mexer com data já é chato, ainda misturando bibliotecas...rsrs...

R
Então eu preciso consultar os registros entre as duas datas, eu preciso que retorne para mostrar na tela. segue o codigo novamente.
public ResultSet getLogin(Date data1, Date data2) throws Exception { 

String sql = "SELECT * FROM fornecedor WHERE data BETWEEN ? AND ?"; 
PreparedStatement stmt = connection.prepareStatement(sql); 

Calendar c = Calendar.getInstance(); 
c.set(Calendar.DAY_OF_MONTH, 20); 
c.set(Calendar.MONTH, 3); 
c.set(Calendar.YEAR, 2013); 

java.sql.Date dt = new java.sql.Date(c.getTimeInMillis()); 





stmt.setDate(1, (java.sql.Date) data1); 
stmt.setDate(2, (java.sql.Date) data2); 


stmt.setDate(1, dt); 
stmt.setDate(2, dt); 

ResultSet rs = stmt.executeQuery(); 
return rs; 
} 
public static void main(String[] args) throws SQLException, Exception { 








String retorno = JOptionPane.showInputDialog("digite data1"); 
Date data1 = new SimpleDateFormat("dd/MM/yyyy").parse(retorno); 

String retorno1 = JOptionPane.showInputDialog("digite data1"); 
Date data2 = new SimpleDateFormat("dd/MM/yyyy").parse(retorno1); 

Relatorio rel = new Relatorio(); 
rel.getLogin(data1, data2); 

Relatorio relatorio = new Relatorio(); 

ResultSet rs = relatorio.getLogin(data1, data2); 

while(rs.next()){ 

System.out.println("doc :" +rs.getString("nome")); 



} 


} 
}

run:
Exception in thread "main" java.lang.ClassCastException: java.util.Date cannot be cast to java.sql.Date
at dao.Relatorio.getLogin(Relatorio.java:56)
at dao.Relatorio.main(Relatorio.java:82)
Java Result: 1
CONSTRUÍDO COM SUCESSO (tempo total: 15 segundos)

P

Bom… esse meu método faz uma consulta no BD e adiciona na variável… vi que vc está setando 4 valores para consulta… primeiro 2 depois outros 2… tente seguir este modelo, recebe um dado de uma classe, faz a consulta e adiciona na variável… é só vc trocar por tipo data ou que necessite… :

private static final String SQL_SIMCARD_EXISTE_SIMCARDDISPOSITIVO = " SELECT SIMCardDispositivo.Dispositivo_Numero AS dispositivo FROM SIMCardDispositivo WHERE SIMCardDispositivo.SIMCard_Numero = 	(?::varchar)::numeric";


	public String existeSimCardDispositivo(String simCard) {
		String dispositivo = null;
		Connection conn = null;
		PreparedStatement ps = null;

		try {
			conn = ConnectionManager.obterConexao();
			ps = conn.prepareStatement(SQL_SIMCARD_EXISTE_SIMCARDDISPOSITIVO);
			ps.setString(1, simCard);
			ResultSet rs = ps.executeQuery();
			
			while (rs.next()) {
				dispositivo = rs.getString("dispositivo");
			}
			
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			ConnectionManager.fecharConexao(conn, null, ps);
		}

		return dispositivo;
	}

Isso ps.setString(1, simCard); significa… colocar o valor no primeiro ? … como vc tem dois campos … dois valores… só que se vc repete, ele sobrescreve… e só vai aceitar os 2 últimos…

L

o que significa esse “(?::varchar)::numeric”?

P

Olá Luiz Augusto Prado

significa pegar uma variável do tipo varchar (String) e converter para numeric… essa nomenclatura é utilizada no postgresql, só deixei isso para ele ver que tem diversas formas de receber um valor e converter…

L

Pacato:
Olá Luiz Augusto Prado

significa pegar uma variável do tipo varchar (String) e converter para numeric… essa nomenclatura é utilizada no postgresql, só deixei isso para ele ver que tem diversas formas de receber um valor e converter…

bem legal!
obrigado Sr. Pacato.

P

Por nada… mas Sr não né? rsrs… abs

Criado 30 de outubro de 2013
Ultima resposta 4 de nov. de 2013
Respostas 13
Participantes 5