getDate() do sql.Date vem com data errada

11 respostas
F

Bom dia, gostaria de saber o motivo dessa data estar vindo errada.

No SQL Server 2008 R2, tenho uma coluna do formato “date”, insiro um registro com a data, por exemplo: “2011-09-30”, se faço um select ele me retorna certo a data.
Já no java quando faço um getDate() do ResultSet, ele me retorna a data “2011-09-28”, sempre com dois dias anteriores a minha data inserida, já fiz testes com outras datas e mesmo assim vem errado.

Alguém sabe o pq???

Obs.: no getColumnClassName do ResultSetMetaData, vejo se é igual ao “java.sql.Date”.

Obrigado!!!

11 Respostas

ibotirama

Felipe posta o código para o pessoal poder analisar melhor.

F
public List<String> getLista(String sql) throws ClassNotFoundException, SQLException {
	Statement stmt = ConexaoBD.getConexaoBD().createStatement();
	ResultSet rs = stmt.executeQuery(sql);
	ResultSetMetaData rsmd = rs.getMetaData();
	int numColunas = rsmd.getColumnCount();
	List<String> lst = new ArrayList<String>();
	SimpleDateFormat sdfd = new SimpleDateFormat("dd/MM/yyyy");
	SimpleDateFormat sdft = new SimpleDateFormat("HH:mm");
	while (rs.next()) {
		for (int i=1; i<numColunas+1; i++) {
			String tipo = rsmd.getColumnClassName(i);
			if (tipo.equals("java.lang.Integer"))
				lst.add(String.valueOf(rs.getInt(i)));
			else if (tipo.equals("java.lang.String"))
				lst.add(rs.getString(i));
			else if (tipo.equals("java.sql.Date")) {
				lst.add(sdfd.format(rs.getDate(i)));
			} else if (tipo.equals("java.sql.Time"))
				lst.add(sdft.format(rs.getTime(i)));
		}
	}
	return lst;
}

Na linha 17 está o “erro”, quando tento adicionar na List.

Obrigado!

T

Olá amigo, estava com o mesmo problema que voce, e lendo algusn artigos do pessoal do PHP mesmo… parece que há uma possibilidade de ser algu proximo ao TimeZone do Banco com o Sitema…

Mas nao vou afirmar, tmb nao obtive sucessos…

Minha solução foi somar 2 dias ao meu ResultSet… é meio pedreiro(srsrs) mas nao altera em nada no seu programa, uma vez que esse erro so acontece nas pesquisas.
seguem o meu exemplo ae pra vc

java.util.Date dataSomada = rs.getDate("dt_nasc");
        dataSomada.setDate(dataSomada.getDate() + 2);
        
        toReturn.setCli_dt_nasc(dataSomada);

espero ter ajudado, e desculpa qualquer coisa, tambem nao sou expert em Java

B

Pelo que andei lendo, na época do COM e a comunicação inter-processos OLE, as datas do sistema começavam em 30/12/1899, e utilizando o SQL Server Integration Services para migrar esses dados para SQL Server, o tipo de dado da coluna fica como DT_DATE.

O java.sql.Date espera uma data começando em 01/01/1970.

A solução seria usar uma query em T-SQL do SQL Server (poder ser no próprio SELECT FROM) para converter o tipo para o formato certo, antes de chegar no Java.

Rodolfodj

Me deparei com o mesmo problema.

Como ficaria este select por T-SQL?? O formato do campo no banco é Date e já tentei recuperá-lo com getDate(1), getDate(1, Calendar.getInstance()) e getString(1)
O select fiz de 2 formas:

SELECT CONVERT(datetime2, SEND_DAY) FROM types WHERE ID_TYPE = 3 SELECT send_day FROM types WHERE ID_TYPE = 3

Estou tentando fugir da solução de adicionar +2 ao valor…

drsmachado

Rodolfodj:
Me deparei com o mesmo problema.

Como ficaria este select por T-SQL?? O formato do campo no banco é Date e já tentei recuperá-lo com getDate(1), getDate(1, Calendar.getInstance()) e getString(1)
O select fiz de 2 formas:

SELECT CONVERT(datetime2, SEND_DAY) FROM types WHERE ID_TYPE = 3 SELECT send_day FROM types WHERE ID_TYPE = 3

Estou tentando fugir da solução de adicionar +2 ao valor…


Rodolfodj, quando for “atribuir” algo a um tópico, verifique a data do último comentário. Veja que este é de 2011. Seria mais adequado ter aberto uma nova discussão.
Qual banco de dados está utilizando?

Rodolfodj

drsmachado:

Rodolfodj, quando for “atribuir” algo a um tópico, verifique a data do último comentário. Veja que este é de 2011. Seria mais adequado ter aberto uma nova discussão.
Qual banco de dados está utilizando?

Caro drsmachado,
estava justamente com esta dúvida antes de postar neste tópico, se criava um novo ou reaproveitava um já aberto.

A versão do banco é SQL Server 2008.

drsmachado

Pois é, é que tópicos antigos nem sempre são revisitados por quem os abriu e/ou o pessoal meio que ignora.
Enfim, mesmo com getString está vindo errado? Se for, pode ser problema do driver.
Confesso que é uma situação anormal pra mim.

Rodolfodj

Sim, mesmo com o getString a data vêm errada.

Rodolfodj

Atualizei o jar sqljdbc para a versão 4-4.0 e o problema parou de ocorrer.

Rodolfodj

Atualizei o sqljdbc para a versão 4-4.0 e o problema foi corrigido.

Criado 3 de outubro de 2011
Ultima resposta 30 de ago. de 2013
Respostas 11
Participantes 6