Pessoal boa noite. Tenho um sistem funcionando em um servidor Linux porém este esta com problemas e instalei um novo veio com sistema novo, Jvm nova, mysql etc porém pra minha surpresa começou a dar erro e olhando no bkp q fiz do banco o formato esta AAAA/DD/mm não achei nada parecido na internet meu sistema pesquisa no formato AAAA/mm/DD por isso não lista mais nada. Como corrigir isto ?
o MySQL não armazena datas no formato AAAA/DD/MM, ele armazena um Long (inteiro longo) que representa a quantidade de segundos desde 1970 (padrão Unix para representar datas). No backup obviamente ele armazena AAAA/DD/MM porque o mysqldump (acredito que tenha usado ele) gera um arquivo com todas as DDL, DML e DCL de uma base de dados (ou das tabelas que você marcou)
Dá uma olhada melhor no log da aplicação, do banco e do SO, se quiser posta aqui partes do log para ajudarmos, mas o problema não deve ser esse.
fica assim só na hora de exibir (isso se estiver tratando como data mesmo), internamente no banco ele é um long e independe do formato. Dá uma olhada nos logs, se os campos são data mesmo (se não são varchar), não é esse o problema.
Eu faço um seleção na tabela pela data no formato AAAA/mm/DD mas no banco esta cadastrado no formato AAAA/mm/DD não sei pq. Pra fazer o select Eu pego um Java.útil.date e converto pra Java.sql.date e funciona no outro servidor
Evefuji, eu pago uma mensalidade ai o sistema lista as mensalidades pra eu imprimir. O sistema faz o select e a data que manda pesquisar e obtida pelo Java.útil.dAte convertida pra sql.date So q envio para o banco de dados AAAA/mm/DD mas no banco ficou tudo AAAA/DD/mm ou seja Não retorna nada. A pesquisa vem 0 assim como pagamentos do dia etc
deixa eu ver se entendi, você está fazendo uma consulta no seu sistema enviando a data como parâmetro, no formato String, e por isso o resultado está sendo errado? Pq não envia o parâmetro direto como java.sql.Date para essa consulta também?
De qualquer forma, pode mudar o formato padrão do mysql assim:
U envio como date como disse o banco q ficou com uma forma diferente! Agora desculpa minha ignorância pois sou iniciante. Onde eu digito isso para mudar o formato do banco?
se deu erro, provavelmente você não tem permissão para alterar o valor dessa variável global.
Tem certeza que está enviando java.sql.Date? Se o campo é Date mesmo e você está enviando java.sql.Date não tem problema nenhum o formato padrão, mas se você estiver enviando uma String no meio da query, aí a query na sua aplicação não está bem escrita. Mostra aqui exatamente que query você executa (o código java que gera a query).
public List<Contato> listaMensalidadesPagasUsuarioData(int matricula) {
try {
List<Contato> contatos = new ArrayList<Contato>();
java.util.Date dateUtil = new java.util.Date();
//java.sql.Date dataSql = new java.sql.Date(dateUtil.getTime());
java.sql.Date dataSql = new java.sql.Date(dateUtil.getTime());
System.out.println(dataSql);
PreparedStatement stmt = this.connection.prepareStatement("select c.*,m.*,p.* from contato c inner join mensalidade m inner join pgto p where c.matricula = ? and p.dataPagamento= ? and c.idcontato = m.idcontato and m.idmensalidade = p.idmensalidade and m.pago = 1 group by p.idmensalidade,p.idpgto order by c.matricula,m.ano,m.mesref ASC");
stmt.setInt(1, matricula);
stmt.setDate(2, dataSql);
ResultSet rs = stmt.executeQuery();
while(rs.next()) {
//adiciona a tarefa na lista
contatos.add(populaContato(rs));
}
rs.close();
stmt.close();
return contatos;
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
fiz um syso pra imprimir na tela e sai este formato: 2012-01-03
no banco cadastra como 2012-03-01 isso no pc novo, no servidor antigo funciona que é uma beleza
Alguma referência nas outras tabelas estão quebradas, se não tiver chave estrangeira isso é muito comum, o inner join pode estar filtrando todos os registros. Verifique se todas as tabelas tem registros e se os registros estão retornando corretamente somente com o inner join, sem os outros filtros.
Durante o ETL dos servers, as datas podem ter sido trocadas (visto que talvez não tenha tido permissão para alterar as variáveis de formato, ou ter dado diferença de fuso horário, etc…), verifica se no server as datas estão corretas, verifica bem inclusive as horas (caso seja DateTime ou Timestamp).
Verifica se os registros foram enviados corretamente ao novo servidor, por exemplo, se no lugar de m.pago = 1 não foi 0, ou -1.
Entenda algo.
Você está se preocupando com o formato que está sendo salvo no banco, o que é um erro para esse caso.
Porque? Simples, você tem um campo DATE, dessa forma, sua única preocupação deve ser em persistir um java.sql.Date. Como seu banco fará o registro, independe. Quando quiser extrair esse valor, será executado da mesma forma, você vai extrair um java.sql.Date e o JAVA será responsável por administrar o formato.
Depois, basta transformar em uma java.util.Date e executar o formato que desejar, basta que seja uma data válida.
Você está usando o setDate(int, java.sql.Date) e indica que irá usar o timezone default, ou seja, o da JVM. Podes usar o setDate(int, java.sql.Date, Calendar) e definir qual timezone irá utilizar.