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.
M
mouzer
Eu usei o mysql admin e quando eu insiro um novo registro fica nesse formato tb. Já tentei de tudo e nada
E
evefuji
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.
M
mouzer
E data sim eu editei a tabela, ta muito estranho pq no servidor ta correto.
E
evefuji
isso está correto. Explica melhor o problema que está tendo.
M
mouzer
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
M
mouzer
Pessoal da uma ajuda ai…
E
evefuji
mas qual mensagem de erro ou que comportamento estranho isso está causando?
M
mouzer
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
E
evefuji
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';
M
mouzer
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?
E
evefuji
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í.
M
mouzer
eu uso o mysql query browser…
deu erro na query…
nel
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.
M
mouzer
é DATE
E
evefuji
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).
M
mouzer
este é o código:
publicList<Contato>listaMensalidadesPagasUsuarioData(intmatricula){try{List<Contato>contatos=newArrayList<Contato>();java.util.DatedateUtil=newjava.util.Date();//java.sql.Date dataSql = new java.sql.Date(dateUtil.getTime());java.sql.DatedataSql=newjava.sql.Date(dateUtil.getTime());System.out.println(dataSql);PreparedStatementstmt=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);ResultSetrs=stmt.executeQuery();while(rs.next()){//adiciona a tarefa na listacontatos.add(populaContato(rs));}rs.close();stmt.close();returncontatos;}catch(SQLExceptione){thrownewRuntimeException(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
E
evefuji
penso nas seguintes possibilidades:
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.
nel
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.
M
mouzer
Nel, obrigado por se preocupar em me ajudar, mas sou iniciante, não entendi direito oq quis me ensinar, vc poderia me dar um exemplo?
abraços
M
mouzer
vou dar um exemplo:
tenho uma tabela chamada data
com coluna id - nome - data
e os seguintes dados:
1d = 1 nome = leandro data = 1981-12-29
se eu fizer um select * from data where data = ‘1981-12-29’ irá funcionar correto???
porem quando migrei pro novo sistema operacional a data cadastrada no banco ficou:
1d = 1 nome = leandro data = 1981-29-12 este select então iria retornar null certo? queria corrigir isto no banco.
E
evefuji
não vai retornar null pelo simples fato de que a query não seria compilada. Não conseguiria gerar uma data ‘12 do mês 29’ porque não existe mês 29. O máximo que o java faria quando você usa o setDate para definir uma data em uma query, seria
WHEREdata=STR_TO_DATE('1981-12-29','%Y-%m-%d');
Isso aqui dificilmente dará algum erro como você diz.
M
mouzer
select c.,m.,p.* from contato c inner join mensalidade m inner join pgto p where c.matricula = ? and p.dataPagamento= STR_TO_DATE( ? ,’%Y-%m-%d’) 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
sera que isso funcionaria? ainda nao estou em casa para testar…
M
mouzer
evefuji
o select ta corretissimo, informa a data no formato 1981-12-29
poreeeeem no banco esta aparecendo 1981-29-12 AAAA-mm-dd por isso retorna null, nao lista nada, pq meu select procura por uma data e no banco ta outra
E
evefuji
mouzer, isso só funcionaria se você estivesse enviando o parâmetro como String, não como java.util.Date. Quando você envia java.util.Date ele já “define” o formato. O driver jdbc do mysql já faz esse tipo de tratamento.
Vingdel
Segundo os padrões do MySQL, o formato [color=blue]YYYY-MM-DD[/color] é padrão e não pode ser alterado.
Veja:
The format of a DATE value is ‘YYYY-MM-DD’. According to standard SQL, no other format is permitted. You should use this format in UPDATE expressions and in the WHERE clause of SELECT statements. For example:
Assim que chegar em casa, eu ligo o servidor, tiro um print e posto para voces olharem como está no banco.
fiz um pagamento hoje e esta: 2012-03-01
D
danilovicente
O Meu MYSql quando pega do BD também pega no formato YYYY-DD-MM. Usa um SimpleDateFormat
Vingdel
Como você está acessando essa informação do banco?
Acredito que seja um conflito entre seu SO e seu servidor SQL.
Veja se as configurações de ambos estão batendo legal.
M
mouzer
como assim danilovicente??
vc viu ai minha query sql?
daria um exemplo?
D
danilovicente
mouzer:
como assim danilovicente??
vc viu ai minha query sql?
daria um exemplo?
Estou saindo do trabalho, chegando em casa eu entro e te mando um exemplo.
E
evefuji
@Vingdel, o formato é padrão SQL ANSI, o MySQL segue esse padrão mas não estritamente. Muitas das funções do MySQL não seguem o SQL ANSI, o maior exemplo é a falta do full join. É muito comum mudar de acordo com o locale. Mas o mais provável nesse caso é que o mouzer esteja usando o PHPMyAdmin e ele esteja mostrando o formato que o PHPMyAdmin está configurado.
@Mouzer: tenta fazer a consulta direto no seu cliente SQL. Depois mostra se conseguiu o resultado e a gente te sugere como fazer isso no java.
Vingdel
Então pode ser isso mesmo, configuração da aplicação que está usando para visualizar os dados do banco, no caso dele é o MySQL Query Browser.
Isso se confirma se fizer uma consulta pelo próprio MySQL.
Vamos ver o que ele e diz.
Até mais!
M
mouzer
Amigos… Se eu fizer uma consulta no formato correto ex: select * from data where data = ‘2012-01-03’ ira retornar zero registro pq no banco de dados inexplicavelmente todos os registros estão aparecendo assim: 2012-03-01 já fiz este teste
Vingdel
Sim mouzer, mas vc ta fazendo a consulta pelo MySQL Query Browser ou pelo console?
M
mouzer
eu fiz pelo console e pelo query browser…
ja to ate desistindo, nao acho nada parecido na internet
E
evefuji
mouzer, faz o seguinte, antes de executar a consulta, faz um System.out.println(preparedStatement.toString()); E coloca aqui o que ele imprime no console certo?
o driver jdbc não depende do formato da data na base de dados.
nel
Podes, por favor, postar o modo como persiste a data no banco de dados?
O método que faz a persistência das informações na tabela que está realizando a consulta, por favor.
Poste-o completo. Uma observação, o formato da data salva no banco independe do S.O que utiliza, se executa de uma forma, ela sempre será salva daquela forma.
O seu banco não iria alterar o formato dela, a não ser que tu altere isso nas configurações do seu banco de forma implícita, por padrão, é exatamente a mesma.
No aguardo.
D
danilovicente
Mouzer
Desculpe não consegui entrar ontem mas segue a lógica que eu usei nesse código. É bem simples. Qualquer dúvida me chama aê.
pessoal desculpe a demora, pois estava embarcado mas continuo com o mesmo problema, tenho um sistema rodando em um servidor linux, fui migrar para outro servidor linux atualizado e parou de funcionar, agora eu faco o pagamento e a data do dia e cadastrado no mysql assim: 2012-12-01 e nao 2012-01-12 entao meu sistema nao interpreta mais as datas, porque isso ocorre ja que nao modifiquei nada no sistema??
E
evefuji
tentou ver o locale do seu linux e da sua jvm?
M
mouzer
eu já resolvi, parei de usar o firefox e funcionou, estranho que imprime no console a data corretamente mas cadastra no banco de outra forma, usei o chrome e funcionou normalmente.
Vingdel
mouzer, boa noite!
Você já tentou criar um novo banco no seu novo servidor e ver como vai ficar o campo do tipo DATE?
Faça esse teste.
Vingdel
Mas você havia dito que fez a consulta pelo console e estava no formato YYYY-DD-MM… agora não entendi nada.
M
mouzer
entao, pelo console estava errado, pelo mysql query browser errado, o errado que eu dizia era a data que eu pagava, as que ja estavam cadastradas estava correto
Vingdel
Você conseguiu confundir a cabeça de todos… Você falou que estava tendo problema com o backup, o que deu a entender que todas as datas estavam trocadas. Que antes eram YYYY-MM-DD e passaram a ser YYYY-DD-MM. Tanto que você perguntou se tinha como mudar a configuração do MySQL.
E no final só estava inserindo errado. Você havia dito também que não mudou nada no sistema, mas pelo que entendi nas últimas mensagens, você mudou o navegador. Tudo se explica agora. Em fim, houve falha na comunicação ao descrever o problema.
Se tiver com tua dúvida sanada, por favor, edite o tópico adicionando [RESOLVIDO] ao assunto.
Abraço!
Vingdel
EDIT:
Desculpa… Postagem dupla!
M
mouzer
pode sim ter havido falta de entendimento dos 2 lados, mas quando eu me referia ao nao mudar nada no sistema, eu falei no programa, o sistema operacional era todo novo