Mysql com formato de data AAAA/DD/mm - RESOLVIDO

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 ?

Abraços a todos

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.

Eu usei o mysql admin e quando eu insiro um novo registro fica nesse formato tb. Já tentei de tudo e nada

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.

E data sim eu editei a tabela, ta muito estranho pq no servidor ta correto.

isso está correto. Explica melhor o problema que está tendo.

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

Pessoal da uma ajuda ai…

mas qual mensagem de erro ou que comportamento estranho isso está causando?

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:

set global variable date_format = '%Y/%d/%m';

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?

O envio como java.sql.Date não fica diferente, é um número Long. O que mudou é somente a forma de exibição ou, se você envia como varchar(String).

Pelo que vi você usa o PHPMyAdmin, nele tem um botão lá em cima SQL, que você envia um comando para o mysql. Pode usar esse comando aí.

eu uso o mysql query browser…
deu erro na query… :frowning:

Mouzer, qual o tipo da data no banco de dados?
Esqueça todo o resto, JAVA e etc, apenas diga o tipo da data (DATE, LONG, VARCHAR…).

Abraços.

é DATE

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).

este é o código:

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

penso nas seguintes possibilidades:

  1. 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.
  2. 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).
  3. 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.

De resto, não vejo problema algum.