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

48 respostas
M

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

48 Respostas

E

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

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

E

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

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

E

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

M

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

Pessoal da uma ajuda ai…

E

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

M

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

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

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

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

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

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

é DATE

E

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

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

E

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

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

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

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

WHERE data = STR_TO_DATE('1981-12-29 ','%Y-%m-%d');

Isso aqui dificilmente dará algum erro como você diz.

M

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

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

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:
FONTE: http://dev.mysql.com/doc/refman/5.6/en/using-date.html

Abraço!

M

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

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

como assim danilovicente??
vc viu ai minha query sql?
daria um exemplo?

D

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

@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

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

eu fiz pelo console e pelo query browser…
ja to ate desistindo, nao acho nada parecido na internet

E

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
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ê.
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.GregorianCalendar;

public class Teste {

    public Teste() {
        String data = "2012-03-01";
        SimpleDateFormat formata = new SimpleDateFormat("yyyy-dd-MM");
        SimpleDateFormat converte = new SimpleDateFormat("dd/MM/yyyy");
            Date date = new GregorianCalendar().getTime();
            System.out.println("Formatada: "+date+" Convertida: "+converte.format(date));
            try{
            date = formata.parse(data);
            System.out.println("Entrada: "+data+" Formatada: "+date+" Convertida: "+converte.format(date));
            }catch(ParseException e){
                e.printStackTrace();
            }

    }

    public static void main(String[] args) {
        new Teste();
    }
M

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

tentou ver o locale do seu linux e da sua jvm?

M

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

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

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

Criado 2 de janeiro de 2012
Ultima resposta 13 de jan. de 2012
Respostas 48
Participantes 5