[RESOLVIDO] Data em formato "int(11)" no banco de dados

17 respostas
douglasjunior

Olá pessoal

Estou fazendo em JAVA um gerador de relatórios que lê um banco de dados MySQL de um sistema de Atendimento Online via chat, neste banco de dados estão cadastrados os operadores, ficam arquivados os Chats de atendimento, avaliações de atendimento, anexos, etc.

Porém me deparei com um problema meio inusitado.

Na tabela onde ficam arquivados os Chats, existem as colunas que guardam a data/hora em que o chat foi iniciado e também finalizado, e é aí que está o problema.

O formato das colunas que guarda Data/Hora é “int(11)”.

Vejam abaixo as colunas “time”, “endtime” e “closed” da tabela “chat_archive”:

time       endtime    closed     chat_id    
[telefone removido] [telefone removido] [telefone removido] 12945 
[telefone removido] [telefone removido] [telefone removido] 12042 
[telefone removido] [telefone removido] [telefone removido] 12007 
[telefone removido] [telefone removido] [telefone removido] 12782 
[telefone removido] [telefone removido] [telefone removido] 12843

No Java eu até tentei utilizar o médito “getTime()” da Classe “Date”, mas não é a mesma coisa:

SimpleDateFormat format = new SimpleDateFormat("dd/MM/yyyy");

            Date dataInicial = format.parse("01/05/2011");
            Date dataFinal = format.parse("31/12/2011");

            String sql = "";

            sql += "SELECT o.id, p.first_name, p.last_name, c.qtd_chat "
                    + "FROM "
                    + "operators o, "
                    + "profiles p, "
                    + "(SELECT c.internal_id, count(*) as qtd_chat FROM chat_archive c WHERE c.time >= " + (dataInicial.getTime()) + " AND c.endtime <= " + (dataFinal.getTime()) + " GROUP BY c.internal_id) c "
                    + "WHERE "
                    + "p.id = o.id AND "
                    + "o.id = c.internal_id "
                    + "ORDER BY p.first_name, p.last_name ";

Gostaria de saber se alguém tem ideia de como essas datas estão gravadas nesse banco de dados.

Abraço
Douglas Junior

17 Respostas

nel

Bom dia Douglas.

Também achei confuso esse formato. Gostaria de entender o motivo pelo qual não usar um TIMESTAMP, por exemplo.
Bom, você não tem acesso ao código de inserção ? Seria a melhor maneira de entender o formato.

Pode ser a soma da data com hora, pode começar hora e terminar com a data, enfim, complicado.
Abraços.

douglasjunior

nel:
Bom dia Douglas.

Também achei confuso esse formato. Gostaria de entender o motivo pelo qual não usar um TIMESTAMP, por exemplo.
Bom, você não tem acesso ao código de inserção ? Seria a melhor maneira de entender o formato.

Pode ser a soma da data com hora, pode começar hora e terminar com a data, enfim, complicado.
Abraços.

Infelizmente não tenho acesso ao código fonte do sistema que grava neste banco.

É um banco de dados daquele Software “LiveZilla” de Atendimento Online.

Abraço
Douglas Junior

nel

douglasjunior:
nel:
Bom dia Douglas.

Também achei confuso esse formato. Gostaria de entender o motivo pelo qual não usar um TIMESTAMP, por exemplo.
Bom, você não tem acesso ao código de inserção ? Seria a melhor maneira de entender o formato.

Pode ser a soma da data com hora, pode começar hora e terminar com a data, enfim, complicado.
Abraços.

Infelizmente não tenho acesso ao código fonte do sistema que grava neste banco.

É um banco de dados daquele Software “LiveZilla” de Atendimento Online.

Abraço
Douglas Junior

Então Douglas, infelizmente vejo duas saídas:

1 - Investigar como este software salva a data, através de pesquisas e etc

2 - Tentar compreender a lógica por trás dessa persistência.

A questão 2 acho perigosa, teria de ter 100% de certeza que encontrou a lógica de persistência correta, o que faz com que você tenha de executar muitos, muitos testes.
Boa sorte colega.

Abraços.

douglasjunior

nel:

Então Douglas, infelizmente vejo duas saídas:

1 - Investigar como este software salva a data, através de pesquisas e etc

2 - Tentar compreender a lógica por trás dessa persistência.

A questão 2 acho perigosa, teria de ter 100% de certeza que encontrou a lógica de persistência correta, o que faz com que você tenha de executar muitos, muitos testes.
Boa sorte colega.

Abraços.

Pois é, isso já estou fazendo, resolvi perguntar aqui para saber se alguém tem ideia do que seja hehehe

Se mais alguém quiser opinar ficarei grato.

Obrigado pelos seus esclarecimentos nel

Abraço
Douglas Junior

D

Pode ser que seja um Long. tenta isso.

public class Test {

    public static void main(String[] args) {
        Date tempo = new Date[telefone removido]);
        Date tempo2 = new Date[telefone removido]);
        Date tempo3 = new Date[telefone removido]);
                DateFormat df = new SimpleDateFormat ("dd/MM/yyyy HH:mm:ss.SSS");  
        System.out.println("Inicio: "+tempo+" Finalizado: "+tempo2+" Fechado: "+tempo3);
        System.out.println("Inicio: "+df.format(tempo)+" Finalizado: "+df.format(tempo2)+" Fechado: "+df.format(tempo3));
    }
}

Nesses logs que você passou não faz muito sentido, pois tem uma data bem antiga e um tempo bem curto.

douglasjunior
danilovicente:
Pode ser que seja um Long. tenta isso.
public class Test {

    public static void main(String[] args) {
        Date tempo = new Date[telefone removido]);
        Date tempo2 = new Date[telefone removido]);
        Date tempo3 = new Date[telefone removido]);
                DateFormat df = new SimpleDateFormat ("dd/MM/yyyy HH:mm:ss.SSS");  
        System.out.println("Inicio: "+tempo+" Finalizado: "+tempo2+" Fechado: "+tempo3);
        System.out.println("Inicio: "+df.format(tempo)+" Finalizado: "+df.format(tempo2)+" Fechado: "+df.format(tempo3));
    }
}

Nesses logs que você passou não faz muito sentido, pois tem uma data bem antiga e um tempo bem curto.

Isso eu também já havia tentando, olha a data que ele gera fazendo dessa forma:

Thu Jan 15 22:31:24 BRT 1970
Thu Jan 15 22:31:24 BRT 1970
Thu Jan 15 22:31:24 BRT 1970

Realmente é um mistério esse formato que eles utilizam, acredito que já deve ser para evitar de terceiros lerem com facilidade as informações do banco.

obs: fazendo isso que indicou, é a mesma coisa de eu gerar um Objeto do tipo Date e depois utilizar o método "getTime()", foi a primeira coisa que pensei logo que olhei para os dados do banco, mas infelizmente não funciona.

Abraço
Douglas Junior

D
douglasjunior:
danilovicente:
Pode ser que seja um Long. tenta isso.
public class Test {

    public static void main(String[] args) {
        Date tempo = new Date[telefone removido]);
        Date tempo2 = new Date[telefone removido]);
        Date tempo3 = new Date[telefone removido]);
                DateFormat df = new SimpleDateFormat ("dd/MM/yyyy HH:mm:ss.SSS");  
        System.out.println("Inicio: "+tempo+" Finalizado: "+tempo2+" Fechado: "+tempo3);
        System.out.println("Inicio: "+df.format(tempo)+" Finalizado: "+df.format(tempo2)+" Fechado: "+df.format(tempo3));
    }
}

Nesses logs que você passou não faz muito sentido, pois tem uma data bem antiga e um tempo bem curto.

Isso eu também já havia tentando, olha a data que ele gera fazendo dessa forma:

Thu Jan 15 22:31:24 BRT 1970
Thu Jan 15 22:31:24 BRT 1970
Thu Jan 15 22:31:24 BRT 1970

Realmente é um mistério esse formato que eles utilizam, acredito que já deve ser para evitar de terceiros lerem com facilidade as informações do banco.

obs: fazendo isso que indicou, é a mesma coisa de eu gerar um Objeto do tipo Date e depois utilizar o método "getTime()", foi a primeira coisa que pensei logo que olhei para os dados do banco, mas infelizmente não funciona.

Abraço
Douglas Junior

Têm como passar o nome do chat? Para ver se podemos ajudar?

douglasjunior

danilovicente:

Têm como passar o nome do chat? Para ver se podemos ajudar?

Tem sim Danilo, é o LiveZilla. http://www.livezilla.net

Ele possui versão gratuita, basta efetuar o Download do Instalador no site deles, vai precisar de um servidor PHP rodando e um banco em MySQL. (eu uso o XAMPP para subir servidor APACHE e MySQL em meu PC)

O sistema deles é desenvolvido em PHP na parte do cliente que fica integrado ao site de nossa empresa e aparentemente em C# na parte dos operadores e atendentes que fica em nossos PCs. (penso que seja C# pois é preciso instalar o .NET Framework 2.0 durante a instalação do cliente)

Infelizmente não posso passar a vocês um DUMP do meu banco de dados pois existe um histórico grande de atendimentos e dados confidenciais de clientes :slight_smile:

Aqui vai um guia de instalação do LiveZilla para quem quiser conhecer http://www.zooming.com.br/fazer-site/livezilla-instalar-chat-no-seu-site/

Abraço
Douglas Junior

douglasjunior

danilovicente:

Têm como passar o nome do chat? Para ver se podemos ajudar?

Criei uma base de dados de teste para poder disponibilizar a vocês.

Fiz um DUMP do banco, aqui está http://www.4shared.com/document/vaUPhAfs/demo-livezilla.html

Basta importar no MySQL e dar uma olhada no conteúdo da tabela “chat_archive”, ou qualquer outra que tenha armazenamento de data.

Abraço
Douglas Junior

nel

Eu não li, mas no site deles não é indicado como é realizado a persistência em banco ?
Por se tratar de um int(11), provavelmente é um long que é persistido, a questão é conhecer como esse long é gerado.

Sem saber isso, sua caçada será mais complexa.

douglasjunior

nel:
Eu não li, mas no site deles não é indicado como é realizado a persistência em banco ?
Por se tratar de um int(11), provavelmente é um long que é persistido, a questão é conhecer como esse long é gerado.

Sem saber isso, sua caçada será mais complexa.

Eu não cheguei a entrar em contato com eles para saber essas coisas, pois é uma empresa alemã e dá um trabalha do caramba falar com eles.

Eles vendem um módulo do sistema que gera alguns relatório, módulo este que já adquirimos, pagamos cerca de 399 euros, porém são poucos relatórios e os filtros são muito limitados. Para ajudar eles não aceitam customizações ou pedido de relatório personalizado.

No último contato que fizemos, eles disseram que iriam sair novos relatórios nesta atualização que lançaram recentemente, porém nesta atualização também contem uma surpresa, é preciso licenciar a quantidade de Operadores (atendentes) utilizados, até duas versões atrás não era preciso este tipo de licença. Para se ter uma ideia, acima de 10 atendentes a licença fica por 899.90?. Sendo assim, no momento a atualização também está fora dos planos.

Enfim, está complicado.

Eu andei pensando, e vi que talvez olhando para o código PHP seja possível obter essa informação de como as datas são gravas no banco, pois temos acesso a todo o código PHP da aplicação, mesmo porque a aplicação fica em nosso servidor. Talvez seja a única saída, aprender PHP para descobrir como isso funciona.

Abraço
Douglas Junior

D

Com certeza você vai ter a resposta aí no seu servidor. Chegando em casa a noite eu vou criar um pra mim e fazer os testes e ver se consigo te ajudar. Se der certo depois negociamos os Royalty ahushuahsu

douglasjunior

Com certeza! :smiley:

Abraço
Douglas Junior

drsmachado

Se tiver os códigos de gravação da data, basta postar aqui no guj, na área de outras linguagens e pedir ajuda.

douglasjunior

Garela

Acho que descobri o caminho das pedras, porém não estou sabendo fazer isso no JAVA.

Em PHP é feito assim para converter o Date para Int >> http://php.net/manual/pt_BR/function.mktime.php

Porém em JAVA não consegui achar nada equivalente, alguém tem ideia?

Abraço
Douglas Junior

nel

douglasjunior:
Garela

Acho que descobri o caminho das pedras, porém não estou sabendo fazer isso no JAVA.

Em PHP é feito assim para converter o Date para Int >> http://php.net/manual/pt_BR/function.mktime.php

Porém em JAVA não consegui achar nada equivalente, alguém tem ideia?

Abraço
Douglas Junior

Oi Douglas, veja o que descobri:

long l = [telefone removido]; Timestamp ts = new Timestamp(l*1000); Date d = new Date(ts.getTime()); System.out.println(d);

Ficou certinho a data.
Aqui tem um site para tu poder testar: http://www.epochconverter.com/

Bem bacana ele. Acredito que isso possa ser uma solução para você. Ali é java.sql.Timestamp e java.util.Date ok?
Leia sobre o “timestamp unix java” ou somente “timestamp unix”, para entender o processo.

Abraços.

douglasjunior

Cara, obrigado pela ajuda.

Matamos a charada, não por ter utilizado TimeStamp e sim pela forma de multiplicar por 1000.

// ERRADO
        long l = [telefone removido] * 1000;
        System.out.println(new Timestamp(l));
        // imprime: 1970-01-02 03:26:34.312

        // CERTO
        long l2 = [telefone removido];
        System.out.println(new Timestamp(l2 * 1000));
        // imprime: 2011-03-30 08:31:25.0

E com Date é mesma coisa:

// ERRADO
        long l = [telefone removido] * 1000;
        System.out.println(new Date(l));
        // imprime: Fri Jan 02 03:26:34 BRT 1970

        // CERTO
        long l2 = [telefone removido];
        System.out.println(new Date(l2 * 1000));
        // imprime: Wed Mar 30 08:31:25 BRT 2011

Obrigado a todos que contribuíram.

Abraços
Douglas Junior

Criado 5 de janeiro de 2012
Ultima resposta 10 de jan. de 2012
Respostas 17
Participantes 4